require 'test/unit'
require_relative '../lib/validate'
require_relative 'fake_db'

class ValidateTest < Test::Unit::TestCase
  def setup
    allow(ProgressBar).to receive(:log)
  end

  def sample_data
    [{header: "Header row"},

     {account_id: 21989, contract_id: 500074, upc: 123456789012, amount: -50, currency: "USD", activity_year: 2022,
      activity_month: 8, apply_year: 2022, apply_month: 8, adjustment_type: "Adjustment", comment: nil,
      distribution_type: "Digital"},

     {account_id: 21989, contract_id: 500073, upc: nil, amount: 1050, currency: "GBP", activity_year: 2022,
      activity_month: 8, apply_year: 2022, apply_month: 9, adjustment_type: "Physical Coop", comment: "A comment",
      distribution_type: nil}
    ]
  end

  def run_validation(rows, adjustments_for_period_id = 285)
    Validate.run(adjustments_for_period_id, File.basename('fake.file'), rows, FakeDB.new, nil)
  end

  def test_currency_code_validation
    rows = sample_data()
    rows[1][:currency] = 'THB'

    validation = run_validation(rows)

    assert validation.invalid_rows.first[:reasons].include?('Currency code is not supported')
  end

  # def test_upc_belongs_to_account
  #   rows = sample_data
  #   rows[1][:upc] = 555555555555

  #   validation = run_validation(rows)
  #   pp validation.invalid_rows
  #   assert validation.invalid_rows.first[:reasons].include?('UPC is not owned by this account')
  # end

  # def test_only_invalid_rows_should_be_invalid
  #   rows = sample_data
  #   rows[1][:account_id] = nil

  #   validation = run_validation(rows)

  #   assert validation.invalid_rows.size == 1, "Got #{validation.invalid_rows.size}"
  # end

  # def test_account_id_not_in_abacus
  #   rows = sample_data
  #   rows[1][:account_id] = 1234

  #   validation = run_validation(rows)

  #   assert validation.invalid_rows.size == 1, "Got #{validation.invalid_rows.size}"
  # end

  # def test_contract_id_not_in_abacus
  #   rows = sample_data
  #   rows[1][:contract_id] = 1234

  #   validation = run_validation(rows)

  #   assert validation.invalid_rows.size == 1, "Got #{validation.invalid_rows.size}"
  # end

  # def test_contract_id_belongs_to_account
  #   rows = sample_data
  #   rows[1][:contract_id] = 1234

  #   validation = run_validation(rows)

  #   assert validation.invalid_rows.size == 1, "Got #{validation.invalid_rows.size}"
  # end

  # def test_one_row_with_multiple_validation_errors
  #   rows = sample_data
  #   rows[1][:account_id] = nil
  #   rows[1][:currency] = 'TBH'
  #   rows[1][:upc] = nil
  #   rows[1][:amount] = 0.00

  #   validation = run_validation(rows)

  #   assert validation.invalid_rows.first[:reasons].include?('Distribution type must be blank if UPC is blank')
  #   assert validation.invalid_rows.first[:reasons].include?('Currency code is not supported')
  #   assert validation.invalid_rows.first[:reasons].include?('Amount cannot be zero')
  # end

  # def test_distribution_type_upc_agreement
  #   rows = sample_data()
  #   rows[1][:upc] = nil

  #   validation = run_validation(rows)

  #   assert validation.invalid_rows.first[:reasons].include?('Distribution type must be blank if UPC is blank')

  #   rows = sample_data()
  #   rows[1][:distribution_type] = nil

  #   validation = run_validation(rows)

  #   assert validation.invalid_rows.first[:reasons].include?('UPC must be blank if distribution type is blank')

  # end

  # def test_distribution_type_value
  #   rows = sample_data()
  #   rows[1][:distribution_type] = 'Bogus'

  #   validation = run_validation(rows)

  #   assert validation.invalid_rows.first[:reasons].include?('Distribution type not supported')
  # end

  # def test_comment_validation
  #   rows = sample_data()
  #   rows[1][:comment] = 'A' * 181

  #   validation = run_validation(rows)

  #   assert validation.invalid_rows.first[:reasons].include?('Comment maximum length is 180 characters')
  # end

  # def test_adjustment_type_required_validation
  #   rows = sample_data()
  #   rows[1][:adjustment_type] = nil

  #   validation = run_validation(rows)

  #   assert validation.invalid_rows.first[:reasons].include?('Adjustment type is required')
  # end

  # def test_adjustment_type_validation
  #   rows = sample_data()
  #   rows[1][:adjustment_type] = 'Total Wrong'

  #   validation = run_validation(rows)

  #   assert validation.invalid_rows.first[:reasons].include?('Adjustment type is not supported by Abacus')
  # end

  # def test_apply_month_required_validation
  #   rows = sample_data()
  #   rows[1][:apply_month] = nil

  #   validation = run_validation(rows)

  #   assert validation.invalid_rows.first[:reasons].include?('Apply month is required')
  # end

  # def test_apply_month_validation
  #   rows = sample_data()
  #   rows[1][:apply_month] = 13

  #   validation = run_validation(rows)

  #   assert validation.invalid_rows.first[:reasons].include?('Apply month must be a valid month number')
  # end

  # def test_apply_year_required_validation
  #   rows = sample_data()
  #   rows[1][:apply_year] = nil

  #   validation = run_validation(rows)

  #   assert validation.invalid_rows.first[:reasons].include?('Apply year is required')
  # end

  # def test_apply_year_validation
  #   rows = sample_data()
  #   rows[1][:apply_year] = 322

  #   validation = run_validation(rows)

  #   assert validation.invalid_rows.first[:reasons].include?('Apply year must be four digits')
  # end

  # def test_apply_period_id_is_open
  #   rows = sample_data
  #   rows[1][:apply_month] = 7
  #   rows[1][:apply_month] = 2022

  #   validation = run_validation(rows)

  #   assert validation.invalid_rows.first[:reasons].include?('Apply period is either missing in Abacus or already closed')
  # end

  # def test_activity_month_required_validation
  #   rows = sample_data()
  #   rows[1][:activity_month] = nil

  #   validation = run_validation(rows)

  #   assert validation.invalid_rows.first[:reasons].include?('Activity month is required')
  # end

  # def test_activity_month_validation
  #   rows = sample_data()
  #   rows[1][:activity_month] = 13

  #   validation = run_validation(rows)

  #   assert validation.invalid_rows.first[:reasons].include?('Activity month must be a valid month number')
  # end

  # def test_activity_year_required_validation
  #   rows = sample_data()
  #   rows[1][:activity_year] = nil

  #   validation = run_validation(rows)

  #   assert validation.invalid_rows.first[:reasons].include?('Activity year is required')
  # end

  # def test_activity_year_validation
  #   rows = sample_data()
  #   rows[1][:activity_year] = 22

  #   validation = run_validation(rows)

  #   assert validation.invalid_rows.first[:reasons].include?('Activity year must be four digits')
  # end

  # def test_account_id_required_validation
  #   rows = sample_data()
  #   rows[1][:account_id] = nil

  #   validation = run_validation(rows)

  #   assert validation.invalid_rows.first[:reasons].include?('Account ID is required')
  # end

  # def test_upc_length_allows_13_characters
  #   rows = sample_data()
  #   rows[1][:upc] = 1234566243523

  #   validation = run_validation(rows)

  #   refute validation.invalid_rows.first[:reasons].include?('UPC must be 12 or 13 characters long')
  # end

  # def test_upc_length_allows_12_characters
  #   rows = sample_data()
  #   rows[1][:upc] = 123456624352

  #   validation = run_validation(rows)

  #   refute validation.invalid_rows.first[:reasons].include?('UPC must be 12 or 13 characters long')
  # end

  # def test_upc_length_too_short_validation
  #   rows = sample_data()
  #   rows[1][:upc] = 1234566

  #   validation = run_validation(rows)

  #   assert validation.invalid_rows.first[:reasons].include?('UPC must be 12 or 13 characters long')
  # end

  # def test_upc_length_too_long_validation
  #   rows = sample_data()
  #   rows[1][:upc] = 12345662435234

  #   validation = run_validation(rows)

  #   assert validation.invalid_rows.first[:reasons].include?('UPC must be 12 or 13 characters long')
  # end

  # def test_amount_required_validation
  #   rows = sample_data()
  #   rows[1][:amount] = nil

  #   validation = run_validation(rows)

  #   assert validation.invalid_rows.first[:reasons].include?('Amount is required')
  # end

  # def test_amount_is_not_zero_validation
  #   rows = sample_data()
  #   rows[1][:amount] = 0.00

  #   validation = run_validation(rows)

  #   assert validation.invalid_rows.first[:reasons].include?('Amount cannot be zero')
  # end

  def test_currency_required_validation
    rows = sample_data()
    rows[1][:currency] = nil

    validation = run_validation(rows)

    assert validation.invalid_rows.first[:reasons].include?('Currency code is required')
  end

end

