import { describe, expect, it } from 'vitest'
import { IL_VAT_SCHEDULE, fromBasisPoints, resolveVatRate } from './rates-table/index.js'
import { resolveTaxability } from './taxability.js'

function rateForTreatment(treatment: ReturnType<typeof resolveTaxability>['treatment']) {
  switch (treatment) {
    case 'standard':
      return resolveVatRate(IL_VAT_SCHEDULE, '2025-01-01')
    case 'zero_rated':
      return fromBasisPoints(0)
    case 'exempt':
      return fromBasisPoints(0)
    default: {
      const exhaustive: never = treatment
      return exhaustive
    }
  }
}

describe('resolveTaxability', () => {
  it('returns standard for an IL supplier selling to an IL customer', () => {
    expect(
      resolveTaxability({
        supplier: { country: 'IL' },
        customer: { country: 'IL' },
        supplyType: 'services',
      }),
    ).toEqual({
      treatment: 'standard',
      reason: 'supplier and customer are both in IL',
    })
  })

  it('returns zero_rated for an IL supplier exporting to a non-IL customer', () => {
    expect(
      resolveTaxability({
        supplier: { country: 'IL' },
        customer: { country: 'US' },
        supplyType: 'digital',
      }),
    ).toEqual({
      treatment: 'zero_rated',
      reason: 'supplier is in IL and customer is outside IL',
    })
  })

  it('composes treatment with rates-table to produce the concrete rate', () => {
    const ilToIl = resolveTaxability({
      supplier: { country: 'IL' },
      customer: { country: 'IL' },
      supplyType: 'goods',
    })
    const ilToUs = resolveTaxability({
      supplier: { country: 'IL' },
      customer: { country: 'US' },
      supplyType: 'goods',
    })

    expect(rateForTreatment(ilToIl.treatment)).toBe(fromBasisPoints(1800))
    expect(rateForTreatment(ilToUs.treatment)).toBe(fromBasisPoints(0))
  })
})
