{-# LANGUAGE ImportQualifiedPost #-}

module Tax.Canada (completeForms) where

import Data.CAProvinceCodes qualified as Province
import Data.Functor.Const (Const)
import Data.Functor.Product (Product (Pair))
import Data.Kind (Type)

import Tax.Canada.Federal qualified as Federal
import Tax.Canada.Federal (fixFederalForms)
import Tax.Canada.Province.AB qualified as AB
import Tax.Canada.Province.BC qualified as BC
import Tax.Canada.Province.MB qualified as MB
import Tax.Canada.Province.ON qualified as ON
import Tax.Canada.T1 (T1, fixT1, t1FieldsForProvince)
import Tax.FDF (FDFs)
import Tax.FDF qualified as FDF

-- | Complete all FDF forms in the given map, keyed by identifiers (@T1@, @428@, @Schedule9@, etc). The inter-form
-- field references are resolved as well.
completeForms :: Province.Code -> FDFs -> Either String FDFs
completeForms :: Code -> FDFs -> Either String FDFs
completeForms Code
Province.AB = Product Forms AB428 FieldConst
-> (Product Forms AB428 Maybe -> Product Forms AB428 Maybe)
-> FDFs
-> Either String FDFs
forall (form :: (* -> *) -> *).
(Apply form, Traversable form) =>
form FieldConst
-> (form Maybe -> form Maybe) -> FDFs -> Either String FDFs
FDF.mapForms Product Forms AB428 FieldConst
AB.returnFields Product Forms AB428 Maybe -> Product Forms AB428 Maybe
AB.fixReturns
completeForms Code
Province.BC = Returns FieldConst
-> (Returns Maybe -> Returns Maybe) -> FDFs -> Either String FDFs
forall (form :: (* -> *) -> *).
(Apply form, Traversable form) =>
form FieldConst
-> (form Maybe -> form Maybe) -> FDFs -> Either String FDFs
FDF.mapForms Returns FieldConst
BC.returnFields Returns Maybe -> Returns Maybe
BC.fixReturns
completeForms Code
Province.MB = Product Forms MB428 FieldConst
-> (Product Forms MB428 Maybe -> Product Forms MB428 Maybe)
-> FDFs
-> Either String FDFs
forall (form :: (* -> *) -> *).
(Apply form, Traversable form) =>
form FieldConst
-> (form Maybe -> form Maybe) -> FDFs -> Either String FDFs
FDF.mapForms Product Forms MB428 FieldConst
MB.returnFields Product Forms MB428 Maybe -> Product Forms MB428 Maybe
MB.fixReturns
completeForms Code
Province.ON = Returns FieldConst
-> (Returns Maybe -> Returns Maybe) -> FDFs -> Either String FDFs
forall (form :: (* -> *) -> *).
(Apply form, Traversable form) =>
form FieldConst
-> (form Maybe -> form Maybe) -> FDFs -> Either String FDFs
FDF.mapForms Returns FieldConst
ON.returnFields Returns Maybe -> Returns Maybe
ON.fixReturns
completeForms Code
p = Forms FieldConst
-> (Forms Maybe -> Forms Maybe) -> FDFs -> Either String FDFs
forall (form :: (* -> *) -> *).
(Apply form, Traversable form) =>
form FieldConst
-> (form Maybe -> form Maybe) -> FDFs -> Either String FDFs
FDF.mapForms (Code -> Forms FieldConst
Federal.formFieldsForProvince Code
p) Forms Maybe -> Forms Maybe
fixFederalForms