{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE GADTs #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedRecordDot #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}

module Tax.Canada.Province.AB.AB428.Fix (AB428, fixAB428) where

import Control.Applicative (liftA2)
import Control.Monad (guard)
import Data.Fixed (Centi)
import Rank2 qualified

import Tax.Canada.Province.AB.AB428.Types
import Tax.Canada.Shared (fixBaseCredit, fixMedicalExpenses, fixSubCalculation, fixTaxIncomeBracket,
                          BaseCredit(cont), MedicalExpenses (difference),
                          SubCalculation (result), TaxIncomeBracket (equalsTax))
import Tax.Util (fixEq, fractionOf, nonNegativeDifference, totalOf)

fixAB428 :: AB428 Maybe -> AB428 Maybe
fixAB428 :: AB428 Maybe -> AB428 Maybe
fixAB428 = (AB428 Maybe -> AB428 Maybe) -> AB428 Maybe -> AB428 Maybe
forall a. Eq a => (a -> a) -> a -> a
fixEq ((AB428 Maybe -> AB428 Maybe) -> AB428 Maybe -> AB428 Maybe)
-> (AB428 Maybe -> AB428 Maybe) -> AB428 Maybe -> AB428 Maybe
forall a b. (a -> b) -> a -> b
$ \ab428 :: AB428 Maybe
ab428@AB428{Page3 Maybe
Page2 Maybe
Page1 Maybe
page1 :: Page1 Maybe
page2 :: Page2 Maybe
page3 :: Page3 Maybe
page3 :: forall (line :: * -> *). AB428 line -> Page3 line
page2 :: forall (line :: * -> *). AB428 line -> Page2 line
page1 :: forall (line :: * -> *). AB428 line -> Page1 line
..}-> AB428{page1 :: Page1 Maybe
page1 = Page1 Maybe -> Page1 Maybe
fixPage1 Page1 Maybe
page1,
                                            page2 :: Page2 Maybe
page2 = AB428 Maybe -> Page2 Maybe -> Page2 Maybe
fixPage2 AB428 Maybe
ab428 Page2 Maybe
page2,
                                            page3 :: Page3 Maybe
page3 = AB428 Maybe -> Page3 Maybe -> Page3 Maybe
fixPage3 AB428 Maybe
ab428 Page3 Maybe
page3}

fixPage1 :: Page1 Maybe -> Page1 Maybe
fixPage1 :: Page1 Maybe -> Page1 Maybe
fixPage1 = (Page1 Maybe -> Page1 Maybe) -> Page1 Maybe -> Page1 Maybe
forall a. Eq a => (a -> a) -> a -> a
fixEq ((Page1 Maybe -> Page1 Maybe) -> Page1 Maybe -> Page1 Maybe)
-> (Page1 Maybe -> Page1 Maybe) -> Page1 Maybe -> Page1 Maybe
forall a b. (a -> b) -> a -> b
$ \Page1{Maybe Centi
Page1PartB Maybe
Page1PartA Maybe
income :: Maybe Centi
partA :: Page1PartA Maybe
partB :: Page1PartB Maybe
partB :: forall (line :: * -> *). Page1 line -> Page1PartB line
partA :: forall (line :: * -> *). Page1 line -> Page1PartA line
income :: forall (line :: * -> *). Page1 line -> line Centi
..}-> Page1{
   income :: Maybe Centi
income = Maybe Centi
income,
   partA :: Page1PartA Maybe
partA = Maybe Centi -> Page1PartA Maybe -> Page1PartA Maybe
fixPage1PartA Maybe Centi
income Page1PartA Maybe
partA,
   partB :: Page1PartB Maybe
partB = Page1PartB Maybe -> Page1PartB Maybe
fixPage1PartB Page1PartB Maybe
partB}

fixPage1PartA :: Maybe Centi -> Page1PartA Maybe -> Page1PartA Maybe
fixPage1PartA :: Maybe Centi -> Page1PartA Maybe -> Page1PartA Maybe
fixPage1PartA Maybe Centi
income = (Page1PartA Maybe -> Page1PartA Maybe)
-> Page1PartA Maybe -> Page1PartA Maybe
forall a. Eq a => (a -> a) -> a -> a
fixEq ((Page1PartA Maybe -> Page1PartA Maybe)
 -> Page1PartA Maybe -> Page1PartA Maybe)
-> (Page1PartA Maybe -> Page1PartA Maybe)
-> Page1PartA Maybe
-> Page1PartA Maybe
forall a b. (a -> b) -> a -> b
$ \Page1PartA{TaxIncomeBracket Maybe
column1 :: TaxIncomeBracket Maybe
column2 :: TaxIncomeBracket Maybe
column3 :: TaxIncomeBracket Maybe
column4 :: TaxIncomeBracket Maybe
column5 :: TaxIncomeBracket Maybe
column5 :: forall (line :: * -> *). Page1PartA line -> TaxIncomeBracket line
column4 :: forall (line :: * -> *). Page1PartA line -> TaxIncomeBracket line
column3 :: forall (line :: * -> *). Page1PartA line -> TaxIncomeBracket line
column2 :: forall (line :: * -> *). Page1PartA line -> TaxIncomeBracket line
column1 :: forall (line :: * -> *). Page1PartA line -> TaxIncomeBracket line
..}-> Page1PartA{
   column1 :: TaxIncomeBracket Maybe
column1 = Maybe Centi
-> Maybe (TaxIncomeBracket Maybe)
-> TaxIncomeBracket Maybe
-> TaxIncomeBracket Maybe
fixTaxIncomeBracket Maybe Centi
income (TaxIncomeBracket Maybe -> Maybe (TaxIncomeBracket Maybe)
forall a. a -> Maybe a
Just TaxIncomeBracket Maybe
column2) TaxIncomeBracket Maybe
column1,
   column2 :: TaxIncomeBracket Maybe
column2 = Maybe Centi
-> Maybe (TaxIncomeBracket Maybe)
-> TaxIncomeBracket Maybe
-> TaxIncomeBracket Maybe
fixTaxIncomeBracket Maybe Centi
income (TaxIncomeBracket Maybe -> Maybe (TaxIncomeBracket Maybe)
forall a. a -> Maybe a
Just TaxIncomeBracket Maybe
column3) TaxIncomeBracket Maybe
column2,
   column3 :: TaxIncomeBracket Maybe
column3 = Maybe Centi
-> Maybe (TaxIncomeBracket Maybe)
-> TaxIncomeBracket Maybe
-> TaxIncomeBracket Maybe
fixTaxIncomeBracket Maybe Centi
income (TaxIncomeBracket Maybe -> Maybe (TaxIncomeBracket Maybe)
forall a. a -> Maybe a
Just TaxIncomeBracket Maybe
column4) TaxIncomeBracket Maybe
column3,
   column4 :: TaxIncomeBracket Maybe
column4 = Maybe Centi
-> Maybe (TaxIncomeBracket Maybe)
-> TaxIncomeBracket Maybe
-> TaxIncomeBracket Maybe
fixTaxIncomeBracket Maybe Centi
income (TaxIncomeBracket Maybe -> Maybe (TaxIncomeBracket Maybe)
forall a. a -> Maybe a
Just TaxIncomeBracket Maybe
column5) TaxIncomeBracket Maybe
column4,
   column5 :: TaxIncomeBracket Maybe
column5 = Maybe Centi
-> Maybe (TaxIncomeBracket Maybe)
-> TaxIncomeBracket Maybe
-> TaxIncomeBracket Maybe
fixTaxIncomeBracket Maybe Centi
income Maybe (TaxIncomeBracket Maybe)
forall a. Maybe a
Nothing TaxIncomeBracket Maybe
column5}

fixPage1PartB :: Page1PartB Maybe -> Page1PartB Maybe
fixPage1PartB :: Page1PartB Maybe -> Page1PartB Maybe
fixPage1PartB = (Page1PartB Maybe -> Page1PartB Maybe)
-> Page1PartB Maybe -> Page1PartB Maybe
forall a. Eq a => (a -> a) -> a -> a
fixEq ((Page1PartB Maybe -> Page1PartB Maybe)
 -> Page1PartB Maybe -> Page1PartB Maybe)
-> (Page1PartB Maybe -> Page1PartB Maybe)
-> Page1PartB Maybe
-> Page1PartB Maybe
forall a b. (a -> b) -> a -> b
$ \part :: Page1PartB Maybe
part@Page1PartB{Maybe Centi
SubCalculation Maybe
BaseCredit Maybe
line9_basic :: Maybe Centi
line10_age :: Maybe Centi
spouseAmount :: BaseCredit Maybe
dependantAmount :: BaseCredit Maybe
line17_infirm :: Maybe Centi
line18 :: Maybe Centi
line19_cppQpp :: Maybe Centi
line20_cppQpp :: Maybe Centi
line21_employmentInsurance :: Maybe Centi
line22_employmentInsurance :: Maybe Centi
line23_adoption :: Maybe Centi
line24_sum :: SubCalculation Maybe
line25 :: Maybe Centi
line25 :: forall (line :: * -> *). Page1PartB line -> line Centi
line24_sum :: forall (line :: * -> *). Page1PartB line -> SubCalculation line
line23_adoption :: forall (line :: * -> *). Page1PartB line -> line Centi
line22_employmentInsurance :: forall (line :: * -> *). Page1PartB line -> line Centi
line21_employmentInsurance :: forall (line :: * -> *). Page1PartB line -> line Centi
line20_cppQpp :: forall (line :: * -> *). Page1PartB line -> line Centi
line19_cppQpp :: forall (line :: * -> *). Page1PartB line -> line Centi
line18 :: forall (line :: * -> *). Page1PartB line -> line Centi
line17_infirm :: forall (line :: * -> *). Page1PartB line -> line Centi
dependantAmount :: forall (line :: * -> *). Page1PartB line -> BaseCredit line
spouseAmount :: forall (line :: * -> *). Page1PartB line -> BaseCredit line
line10_age :: forall (line :: * -> *). Page1PartB line -> line Centi
line9_basic :: forall (line :: * -> *). Page1PartB line -> line Centi
..}-> Page1PartB Maybe
part{
   line9_basic = Just 21885,
   spouseAmount = fixBaseCredit spouseAmount,
   dependantAmount = fixBaseCredit dependantAmount,
   line18 = totalOf [line9_basic, line10_age, spouseAmount.cont, dependantAmount.cont, line17_infirm],
   line24_sum = fixSubCalculation id $
                totalOf [line19_cppQpp,
                         line20_cppQpp,
                         line21_employmentInsurance,
                         line22_employmentInsurance,
                         line23_adoption],
   line25 = totalOf [line18, line24_sum.result]}

fixPage2 :: AB428 Maybe -> Page2 Maybe -> Page2 Maybe
fixPage2 :: AB428 Maybe -> Page2 Maybe -> Page2 Maybe
fixPage2 AB428 Maybe
ab428 = (Page2 Maybe -> Page2 Maybe) -> Page2 Maybe -> Page2 Maybe
forall a. Eq a => (a -> a) -> a -> a
fixEq ((Page2 Maybe -> Page2 Maybe) -> Page2 Maybe -> Page2 Maybe)
-> (Page2 Maybe -> Page2 Maybe) -> Page2 Maybe -> Page2 Maybe
forall a b. (a -> b) -> a -> b
$ \Page2{Page2PartB Maybe
partB :: Page2PartB Maybe
partB :: forall (line :: * -> *). Page2 line -> Page2PartB line
..}-> Page2{
  partB :: Page2PartB Maybe
partB = AB428 Maybe -> Page2PartB Maybe -> Page2PartB Maybe
fixPage2PartB AB428 Maybe
ab428 Page2PartB Maybe
partB}

fixPage2PartB :: AB428 Maybe -> Page2PartB Maybe -> Page2PartB Maybe
fixPage2PartB :: AB428 Maybe -> Page2PartB Maybe -> Page2PartB Maybe
fixPage2PartB AB428 Maybe
ab428 = (Page2PartB Maybe -> Page2PartB Maybe)
-> Page2PartB Maybe -> Page2PartB Maybe
forall a. Eq a => (a -> a) -> a -> a
fixEq ((Page2PartB Maybe -> Page2PartB Maybe)
 -> Page2PartB Maybe -> Page2PartB Maybe)
-> (Page2PartB Maybe -> Page2PartB Maybe)
-> Page2PartB Maybe
-> Page2PartB Maybe
forall a b. (a -> b) -> a -> b
$ \part :: Page2PartB Maybe
part@Page2PartB{Maybe Rational
Maybe Centi
SubCalculation Maybe
MedicalExpenses Maybe
Donations Maybe
line26 :: Maybe Centi
line27_pension :: Maybe Centi
line28_caregiver :: Maybe Centi
line29 :: Maybe Centi
line30_disability :: Maybe Centi
line31 :: Maybe Centi
line32 :: Maybe Centi
line33_interest :: Maybe Centi
line34_education :: Maybe Centi
line35_transferredSpouse :: Maybe Centi
line36 :: Maybe Centi
medicalExpenses :: MedicalExpenses Maybe
line43 :: Maybe Centi
line44_sum :: SubCalculation Maybe
line45 :: Maybe Centi
line46_rate :: Maybe Rational
line47_fraction :: Maybe Centi
donations :: Donations Maybe
line50_sum :: SubCalculation Maybe
line51 :: Maybe Centi
line51 :: forall (line :: * -> *). Page2PartB line -> line Centi
line50_sum :: forall (line :: * -> *). Page2PartB line -> SubCalculation line
donations :: forall (line :: * -> *). Page2PartB line -> Donations line
line47_fraction :: forall (line :: * -> *). Page2PartB line -> line Centi
line46_rate :: forall (line :: * -> *). Page2PartB line -> line Rational
line45 :: forall (line :: * -> *). Page2PartB line -> line Centi
line44_sum :: forall (line :: * -> *). Page2PartB line -> SubCalculation line
line43 :: forall (line :: * -> *). Page2PartB line -> line Centi
medicalExpenses :: forall (line :: * -> *). Page2PartB line -> MedicalExpenses line
line36 :: forall (line :: * -> *). Page2PartB line -> line Centi
line35_transferredSpouse :: forall (line :: * -> *). Page2PartB line -> line Centi
line34_education :: forall (line :: * -> *). Page2PartB line -> line Centi
line33_interest :: forall (line :: * -> *). Page2PartB line -> line Centi
line32 :: forall (line :: * -> *). Page2PartB line -> line Centi
line31 :: forall (line :: * -> *). Page2PartB line -> line Centi
line30_disability :: forall (line :: * -> *). Page2PartB line -> line Centi
line29 :: forall (line :: * -> *). Page2PartB line -> line Centi
line28_caregiver :: forall (line :: * -> *). Page2PartB line -> line Centi
line27_pension :: forall (line :: * -> *). Page2PartB line -> line Centi
line26 :: forall (line :: * -> *). Page2PartB line -> line Centi
..}-> Page2PartB Maybe
part{
   line26 = ab428.page1.partB.line25,
   line29 = totalOf [line26, line27_pension, line28_caregiver],
   line32 = totalOf [line29, line30_disability, line31],
   line36 = totalOf [line32, line33_interest, line34_education, line35_transferredSpouse],
   medicalExpenses = fixMedicalExpenses 2828 medicalExpenses,
   line44_sum = fixSubCalculation id $ totalOf [medicalExpenses.difference, line43],
   line45 = totalOf [line36, line44_sum.result],
   line47_fraction = line46_rate `fractionOf` line45,
   donations = fixDonations donations,
   line50_sum = fixSubCalculation id $ totalOf [donations.line48_fraction, donations.line49_fraction],
   line51 = totalOf [line47_fraction, line50_sum.result]}

fixDonations :: Donations Maybe -> Donations Maybe
fixDonations :: Donations Maybe -> Donations Maybe
fixDonations = (Donations Maybe -> Donations Maybe)
-> Donations Maybe -> Donations Maybe
forall a. Eq a => (a -> a) -> a -> a
fixEq ((Donations Maybe -> Donations Maybe)
 -> Donations Maybe -> Donations Maybe)
-> (Donations Maybe -> Donations Maybe)
-> Donations Maybe
-> Donations Maybe
forall a b. (a -> b) -> a -> b
$ \part :: Donations Maybe
part@Donations{Maybe Centi
line48_base :: Maybe Centi
line48_fraction :: Maybe Centi
line49_base :: Maybe Centi
line49_fraction :: Maybe Centi
line49_fraction :: forall (line :: * -> *). Donations line -> line Centi
line49_base :: forall (line :: * -> *). Donations line -> line Centi
line48_fraction :: forall (line :: * -> *). Donations line -> line Centi
line48_base :: forall (line :: * -> *). Donations line -> line Centi
..} -> Donations Maybe
part{
   line48_fraction = Just 0.6 `fractionOf` line48_base,
   line49_fraction = Just 0.21 `fractionOf` line49_base}

fixPage3 :: AB428 Maybe -> Page3 Maybe -> Page3 Maybe
fixPage3 :: AB428 Maybe -> Page3 Maybe -> Page3 Maybe
fixPage3 AB428 Maybe
ab428 = (Page3 Maybe -> Page3 Maybe) -> Page3 Maybe -> Page3 Maybe
forall a. Eq a => (a -> a) -> a -> a
fixEq ((Page3 Maybe -> Page3 Maybe) -> Page3 Maybe -> Page3 Maybe)
-> (Page3 Maybe -> Page3 Maybe) -> Page3 Maybe -> Page3 Maybe
forall a b. (a -> b) -> a -> b
$ \page :: Page3 Maybe
page@Page3{PartC Maybe
partC :: PartC Maybe
partC :: forall (line :: * -> *). Page3 line -> PartC line
..}-> Page3 Maybe
page{
   partC = fixPartC ab428 partC}

fixPartC :: AB428 Maybe -> PartC Maybe -> PartC Maybe
fixPartC :: AB428 Maybe -> PartC Maybe -> PartC Maybe
fixPartC AB428 Maybe
ab428 = (PartC Maybe -> PartC Maybe) -> PartC Maybe -> PartC Maybe
forall a. Eq a => (a -> a) -> a -> a
fixEq ((PartC Maybe -> PartC Maybe) -> PartC Maybe -> PartC Maybe)
-> (PartC Maybe -> PartC Maybe) -> PartC Maybe -> PartC Maybe
forall a b. (a -> b) -> a -> b
$ \part :: PartC Maybe
part@PartC{Maybe Centi
SubCalculation Maybe
line52_tax :: Maybe Centi
line53_splitIncomeTax :: Maybe Centi
line54 :: Maybe Centi
line55_copy :: Maybe Centi
line56_dividendCredits :: Maybe Centi
line57_copy :: Maybe Centi
line57_fraction :: Maybe Centi
line58_sum :: SubCalculation Maybe
line59_difference :: Maybe Centi
line60_fromT691 :: Maybe Centi
line60_fraction :: Maybe Centi
line61 :: Maybe Centi
line62_foreignCredit :: Maybe Centi
line63_difference :: Maybe Centi
line64_political :: Maybe Centi
line65_political :: Maybe Centi
line66_tax :: Maybe Centi
line66_tax :: forall (line :: * -> *). PartC line -> line Centi
line65_political :: forall (line :: * -> *). PartC line -> line Centi
line64_political :: forall (line :: * -> *). PartC line -> line Centi
line63_difference :: forall (line :: * -> *). PartC line -> line Centi
line62_foreignCredit :: forall (line :: * -> *). PartC line -> line Centi
line61 :: forall (line :: * -> *). PartC line -> line Centi
line60_fraction :: forall (line :: * -> *). PartC line -> line Centi
line60_fromT691 :: forall (line :: * -> *). PartC line -> line Centi
line59_difference :: forall (line :: * -> *). PartC line -> line Centi
line58_sum :: forall (line :: * -> *). PartC line -> SubCalculation line
line57_fraction :: forall (line :: * -> *). PartC line -> line Centi
line57_copy :: forall (line :: * -> *). PartC line -> line Centi
line56_dividendCredits :: forall (line :: * -> *). PartC line -> line Centi
line55_copy :: forall (line :: * -> *). PartC line -> line Centi
line54 :: forall (line :: * -> *). PartC line -> line Centi
line53_splitIncomeTax :: forall (line :: * -> *). PartC line -> line Centi
line52_tax :: forall (line :: * -> *). PartC line -> line Centi
..}-> PartC Maybe
part{
   line52_tax = totalOf [ab428.page1.partA.column1.equalsTax,
                         ab428.page1.partA.column2.equalsTax,
                         ab428.page1.partA.column3.equalsTax,
                         ab428.page1.partA.column4.equalsTax,
                         ab428.page1.partA.column5.equalsTax],
   line54 = totalOf [line52_tax, line53_splitIncomeTax],
   line55_copy = ab428.page2.partB.line51,
   line57_fraction = Just 0.35 `fractionOf` line57_copy,
   line58_sum = fixSubCalculation id $ totalOf [line55_copy, line56_dividendCredits, line57_fraction],
   line59_difference = nonNegativeDifference line54 line58_sum.result,
   line60_fraction = Just 0.35 `fractionOf` line60_fromT691,
   line61 = totalOf [line59_difference, line60_fraction],
   line63_difference = nonNegativeDifference line61 line62_foreignCredit,
   line66_tax = nonNegativeDifference line63_difference line65_political}