{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE LambdaCase #-}

-- | The T1 forms look similar, but there are subtle differences between different provinces and
-- territories. Therefore they share the same 'T1' form type and the same 'fixT1' completion function, but field
-- paths are separately provided by 't1FieldsForProvince'.
module Tax.Canada.T1 (fixT1, formPrefixForProvince, t1FieldsForProvince, module Tax.Canada.T1.Types) where

import Data.CAProvinceCodes qualified as Province
import Data.Enum.Memo (memoize)

import Tax.FDF (FieldConst)
import Tax.Canada.T1.Types
import Tax.Canada.T1.Fix (fixT1)
import Tax.Canada.T1.FieldNames.AB qualified as AB
import Tax.Canada.T1.FieldNames.BC qualified as BC
import Tax.Canada.T1.FieldNames.NB qualified as NB
import Tax.Canada.T1.FieldNames.NL qualified as NL
import Tax.Canada.T1.FieldNames.NT qualified as NT
import Tax.Canada.T1.FieldNames.NU qualified as NU
import Tax.Canada.T1.FieldNames.ON qualified as ON
import Tax.Canada.T1.FieldNames.QC qualified as QC
import Tax.Canada.T1.FieldNames.YT qualified as YT

-- | The distinct provincial prefix of the T1 form PDF file, such as @5006@ in @5006-r-fill-23e.pdf@ for Ontario
formPrefixForProvince :: Province.Code -> String
formPrefixForProvince :: Code -> String
formPrefixForProvince = (Code -> String) -> Code -> String
forall k v. (Bounded k, Enum k) => (k -> v) -> k -> v
memoize ((Code -> String) -> Code -> String)
-> (Code -> String) -> Code -> String
forall a b. (a -> b) -> a -> b
$ \case
   Code
Province.AB -> String
"5015"
   Code
Province.BC -> String
"5010"
   Code
Province.MB -> String
"5015"
   Code
Province.NB -> String
"5000"
   Code
Province.NL -> String
"5001"
   Code
Province.NS -> String
"5015"
   Code
Province.NT -> String
"5012"
   Code
Province.NU -> String
"5014"
   Code
Province.ON -> String
"5006"
   Code
Province.PE -> String
"5000"
   Code
Province.QC -> String
"5005"
   Code
Province.SK -> String
"5015"
   Code
Province.YT -> String
"5011"

-- | T1 field paths for the given province
t1FieldsForProvince :: Province.Code -> T1 FieldConst
t1FieldsForProvince :: Code -> T1 FieldConst
t1FieldsForProvince = (Code -> T1 FieldConst) -> Code -> T1 FieldConst
forall k v. (Bounded k, Enum k) => (k -> v) -> k -> v
memoize ((Code -> T1 FieldConst) -> Code -> T1 FieldConst)
-> (Code -> T1 FieldConst) -> Code -> T1 FieldConst
forall a b. (a -> b) -> a -> b
$ \case
   Code
Province.AB -> T1 FieldConst
AB.t1Fields
   Code
Province.BC -> T1 FieldConst
BC.t1Fields
   Code
Province.MB -> T1 FieldConst
AB.t1Fields
   Code
Province.NB -> T1 FieldConst
NB.t1Fields
   Code
Province.NL -> T1 FieldConst
NL.t1Fields
   Code
Province.NS -> T1 FieldConst
AB.t1Fields
   Code
Province.NT -> T1 FieldConst
NT.t1Fields
   Code
Province.NU -> T1 FieldConst
NU.t1Fields
   Code
Province.ON -> T1 FieldConst
ON.t1Fields
   Code
Province.PE -> T1 FieldConst
NB.t1Fields
   Code
Province.QC -> T1 FieldConst
QC.t1Fields
   Code
Province.SK -> T1 FieldConst
AB.t1Fields
   Code
Province.YT -> T1 FieldConst
YT.t1Fields