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

module Tax.Canada.Province.BC.BC428.Fix (BC428, fixBC428) where

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

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

fixBC428 :: BC428 Maybe -> BC428 Maybe
fixBC428 :: BC428 Maybe -> BC428 Maybe
fixBC428 = (BC428 Maybe -> BC428 Maybe) -> BC428 Maybe -> BC428 Maybe
forall a. Eq a => (a -> a) -> a -> a
fixEq ((BC428 Maybe -> BC428 Maybe) -> BC428 Maybe -> BC428 Maybe)
-> (BC428 Maybe -> BC428 Maybe) -> BC428 Maybe -> BC428 Maybe
forall a b. (a -> b) -> a -> b
$ \bc428 :: BC428 Maybe
bc428@BC428{Page3 Maybe
Page2 Maybe
Page1 Maybe
page1 :: Page1 Maybe
page2 :: Page2 Maybe
page3 :: Page3 Maybe
page3 :: forall (line :: * -> *). BC428 line -> Page3 line
page2 :: forall (line :: * -> *). BC428 line -> Page2 line
page1 :: forall (line :: * -> *). BC428 line -> Page1 line
..}-> BC428{page1 :: Page1 Maybe
page1 = Page1 Maybe -> Page1 Maybe
fixPage1 Page1 Maybe
page1,
                                            page2 :: Page2 Maybe
page2 = BC428 Maybe -> Page2 Maybe -> Page2 Maybe
fixPage2 BC428 Maybe
bc428 Page2 Maybe
page2,
                                            page3 :: Page3 Maybe
page3 = BC428 Maybe -> Page3 Maybe -> Page3 Maybe
fixPage3 BC428 Maybe
bc428 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{Page1PartB Maybe
Page1PartA Maybe
partA :: Page1PartA Maybe
partB :: Page1PartB Maybe
partB :: forall (line :: * -> *). Page1 line -> Page1PartB line
partA :: forall (line :: * -> *). Page1 line -> Page1PartA line
..}-> Page1{
   partA :: Page1PartA Maybe
partA = Page1PartA Maybe -> Page1PartA Maybe
fixPage1PartA Page1PartA Maybe
partA,
   partB :: Page1PartB Maybe
partB = Page1PartB Maybe -> Page1PartB Maybe
fixPage1PartB Page1PartB Maybe
partB}

fixPage1PartA :: Page1PartA Maybe -> Page1PartA Maybe
fixPage1PartA :: Page1PartA Maybe -> Page1PartA Maybe
fixPage1PartA = (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{Maybe Centi
TaxIncomeBracket Maybe
income :: Maybe Centi
column1 :: TaxIncomeBracket Maybe
column2 :: TaxIncomeBracket Maybe
column3 :: TaxIncomeBracket Maybe
column4 :: TaxIncomeBracket Maybe
column5 :: TaxIncomeBracket Maybe
column6 :: TaxIncomeBracket Maybe
column7 :: TaxIncomeBracket Maybe
column7 :: forall (line :: * -> *). Page1PartA line -> TaxIncomeBracket line
column6 :: forall (line :: * -> *). Page1PartA line -> TaxIncomeBracket line
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
income :: forall (line :: * -> *). Page1PartA line -> line Centi
..}-> Page1PartA{
   income :: Maybe Centi
income = Maybe Centi
income,
   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 (TaxIncomeBracket Maybe -> Maybe (TaxIncomeBracket Maybe)
forall a. a -> Maybe a
Just TaxIncomeBracket Maybe
column6) TaxIncomeBracket Maybe
column5,
   column6 :: TaxIncomeBracket Maybe
column6 = 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
column7) TaxIncomeBracket Maybe
column6,
   column7 :: TaxIncomeBracket Maybe
column7 = Maybe Centi
-> Maybe (TaxIncomeBracket Maybe)
-> TaxIncomeBracket Maybe
-> TaxIncomeBracket Maybe
fixTaxIncomeBracket Maybe Centi
income Maybe (TaxIncomeBracket Maybe)
forall a. Maybe a
Nothing TaxIncomeBracket Maybe
column7}

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
BaseCredit Maybe
line16_basic :: Maybe Centi
line17_age :: Maybe Centi
spouseAmount :: BaseCredit Maybe
dependantAmount :: BaseCredit Maybe
line24_caregiver :: Maybe Centi
line25 :: Maybe Centi
line25 :: forall (line :: * -> *). Page1PartB line -> line Centi
line24_caregiver :: forall (line :: * -> *). Page1PartB line -> line Centi
dependantAmount :: forall (line :: * -> *). Page1PartB line -> BaseCredit line
spouseAmount :: forall (line :: * -> *). Page1PartB line -> BaseCredit line
line17_age :: forall (line :: * -> *). Page1PartB line -> line Centi
line16_basic :: forall (line :: * -> *). Page1PartB line -> line Centi
..}-> Page1PartB Maybe
part{
   line16_basic = Just 12580,
   spouseAmount = fixBaseCredit spouseAmount,
   dependantAmount = fixBaseCredit dependantAmount,
   line25 = totalOf [line16_basic, line17_age, spouseAmount.cont, dependantAmount.cont, line24_caregiver]}

fixPage2 :: BC428 Maybe -> Page2 Maybe -> Page2 Maybe
fixPage2 :: BC428 Maybe -> Page2 Maybe -> Page2 Maybe
fixPage2 BC428 Maybe
bc428 = (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 = BC428 Maybe -> Page2PartB Maybe -> Page2PartB Maybe
fixPage2PartB BC428 Maybe
bc428 Page2PartB Maybe
partB}

fixPage2PartB :: BC428 Maybe -> Page2PartB Maybe -> Page2PartB Maybe
fixPage2PartB :: BC428 Maybe -> Page2PartB Maybe -> Page2PartB Maybe
fixPage2PartB BC428 Maybe
bc428 = (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
line26 :: Maybe Centi
line27_cppQpp :: Maybe Centi
line28_cppQpp :: Maybe Centi
line29_employmentInsurance :: Maybe Centi
line30_employmentInsurance :: Maybe Centi
line31_firefighters :: Maybe Centi
line32_rescue :: Maybe Centi
line33_sum :: SubCalculation Maybe
line34_adoption :: Maybe Centi
line35 :: Maybe Centi
line36_pension :: Maybe Centi
line37 :: Maybe Centi
line38_disability :: Maybe Centi
line39 :: Maybe Centi
line40 :: Maybe Centi
line41_interest :: Maybe Centi
line42_education :: Maybe Centi
line43_transferredChild :: Maybe Centi
line44_transferredSpouse :: Maybe Centi
line45 :: Maybe Centi
medicalExpenses :: MedicalExpenses Maybe
line52 :: Maybe Centi
line53_sum :: SubCalculation Maybe
line54 :: Maybe Centi
line55_rate :: Maybe Rational
line56_fraction :: Maybe Centi
line57_donations :: Maybe Centi
line58 :: Maybe Centi
line59_food :: Maybe Centi
line59_fraction :: Maybe Centi
line60 :: Maybe Centi
line60 :: forall (line :: * -> *). Page2PartB line -> line Centi
line59_fraction :: forall (line :: * -> *). Page2PartB line -> line Centi
line59_food :: forall (line :: * -> *). Page2PartB line -> line Centi
line58 :: forall (line :: * -> *). Page2PartB line -> line Centi
line57_donations :: forall (line :: * -> *). Page2PartB line -> line Centi
line56_fraction :: forall (line :: * -> *). Page2PartB line -> line Centi
line55_rate :: forall (line :: * -> *). Page2PartB line -> line Rational
line54 :: forall (line :: * -> *). Page2PartB line -> line Centi
line53_sum :: forall (line :: * -> *). Page2PartB line -> SubCalculation line
line52 :: forall (line :: * -> *). Page2PartB line -> line Centi
medicalExpenses :: forall (line :: * -> *). Page2PartB line -> MedicalExpenses line
line45 :: forall (line :: * -> *). Page2PartB line -> line Centi
line44_transferredSpouse :: forall (line :: * -> *). Page2PartB line -> line Centi
line43_transferredChild :: forall (line :: * -> *). Page2PartB line -> line Centi
line42_education :: forall (line :: * -> *). Page2PartB line -> line Centi
line41_interest :: forall (line :: * -> *). Page2PartB line -> line Centi
line40 :: forall (line :: * -> *). Page2PartB line -> line Centi
line39 :: forall (line :: * -> *). Page2PartB line -> line Centi
line38_disability :: forall (line :: * -> *). Page2PartB line -> line Centi
line37 :: forall (line :: * -> *). Page2PartB line -> line Centi
line36_pension :: forall (line :: * -> *). Page2PartB line -> line Centi
line35 :: forall (line :: * -> *). Page2PartB line -> line Centi
line34_adoption :: forall (line :: * -> *). Page2PartB line -> line Centi
line33_sum :: forall (line :: * -> *). Page2PartB line -> SubCalculation line
line32_rescue :: forall (line :: * -> *). Page2PartB line -> line Centi
line31_firefighters :: forall (line :: * -> *). Page2PartB line -> line Centi
line30_employmentInsurance :: forall (line :: * -> *). Page2PartB line -> line Centi
line29_employmentInsurance :: forall (line :: * -> *). Page2PartB line -> line Centi
line28_cppQpp :: forall (line :: * -> *). Page2PartB line -> line Centi
line27_cppQpp :: forall (line :: * -> *). Page2PartB line -> line Centi
line26 :: forall (line :: * -> *). Page2PartB line -> line Centi
..}-> Page2PartB Maybe
part{
   line26 = bc428.page1.partB.line25,
   line33_sum = fixSubCalculation id $
                totalOf [line27_cppQpp,
                         line28_cppQpp,
                         line29_employmentInsurance,
                         line30_employmentInsurance,
                         line31_firefighters,
                         line32_rescue],
   line35 = totalOf [line26, line33_sum.result, line34_adoption],
   line37 = totalOf [line35, line36_pension],
   line40 = totalOf [line37, line38_disability, line39],
   line45 = totalOf [line40, line41_interest, line42_education, line43_transferredChild, line44_transferredSpouse],
   medicalExpenses = fixMedicalExpenses 2616 medicalExpenses,
   line53_sum = fixSubCalculation id $ totalOf [medicalExpenses.difference, line52],
   line54 = totalOf [line45, line53_sum.result],
   line56_fraction = line55_rate `fractionOf` line54,
   line58 = totalOf [line56_fraction, line57_donations],
   line59_fraction = Just 0.25 `fractionOf` line59_food,
   line60 = totalOf [line58, line59_fraction]}

fixPartC :: BC428 Maybe -> PartC Maybe -> PartC Maybe
fixPartC :: BC428 Maybe -> PartC Maybe -> PartC Maybe
fixPartC BC428 Maybe
bc428 = (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
line61_tax :: Maybe Centi
line62_splitIncomeTax :: Maybe Centi
line63 :: Maybe Centi
line64_copy :: Maybe Centi
line65_dividendCredits :: Maybe Centi
line66_copy :: Maybe Centi
line66_fraction :: Maybe Centi
line67_sum :: SubCalculation Maybe
line68 :: Maybe Centi
line69_copy :: Maybe Centi
line69_fraction :: Maybe Centi
line70 :: Maybe Centi
line71_foreignCredit :: Maybe Centi
line72 :: Maybe Centi
line72 :: forall (line :: * -> *). PartC line -> line Centi
line71_foreignCredit :: forall (line :: * -> *). PartC line -> line Centi
line70 :: forall (line :: * -> *). PartC line -> line Centi
line69_fraction :: forall (line :: * -> *). PartC line -> line Centi
line69_copy :: forall (line :: * -> *). PartC line -> line Centi
line68 :: forall (line :: * -> *). PartC line -> line Centi
line67_sum :: forall (line :: * -> *). PartC line -> SubCalculation line
line66_fraction :: forall (line :: * -> *). PartC line -> line Centi
line66_copy :: forall (line :: * -> *). PartC line -> line Centi
line65_dividendCredits :: forall (line :: * -> *). PartC line -> line Centi
line64_copy :: forall (line :: * -> *). PartC line -> line Centi
line63 :: forall (line :: * -> *). PartC line -> line Centi
line62_splitIncomeTax :: forall (line :: * -> *). PartC line -> line Centi
line61_tax :: forall (line :: * -> *). PartC line -> line Centi
..}-> PartC Maybe
part{
   line61_tax = totalOf [bc428.page1.partA.column1.equalsTax,
                         bc428.page1.partA.column2.equalsTax,
                         bc428.page1.partA.column3.equalsTax,
                         bc428.page1.partA.column4.equalsTax,
                         bc428.page1.partA.column5.equalsTax,
                         bc428.page1.partA.column6.equalsTax,
                         bc428.page1.partA.column7.equalsTax],
   line63 = totalOf [line61_tax, line62_splitIncomeTax],
   line64_copy = bc428.page2.partB.line60,
   line66_fraction = Just 0.337 `fractionOf` line66_copy,
   line67_sum = fixSubCalculation id $ totalOf [line64_copy, line65_dividendCredits, line66_fraction],
   line68 = nonNegativeDifference line63 line67_sum.result,
   line69_fraction = Just 0.337 `fractionOf` line69_copy,
   line70 = totalOf [line68, line69_fraction],
   line72 = nonNegativeDifference line70 line71_foreignCredit}

fixPage3 :: BC428 Maybe -> Page3 Maybe -> Page3 Maybe
fixPage3 :: BC428 Maybe -> Page3 Maybe -> Page3 Maybe
fixPage3 BC428 Maybe
bc428 = (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{Maybe Rational
Maybe Text
Maybe Centi
SubCalculation Maybe
PartC Maybe
partC :: PartC Maybe
line73_basicReduction :: Maybe Centi
line74_copy :: Maybe Centi
line75_base :: Maybe Centi
line76_difference :: Maybe Centi
line77_rate :: Maybe Rational
line78_fraction :: SubCalculation Maybe
line79_difference :: SubCalculation Maybe
line80_difference :: Maybe Centi
line81_logging :: Maybe Centi
line82_difference :: Maybe Centi
line83_political :: Maybe Centi
line84_political :: Maybe Centi
line85_difference :: Maybe Centi
line86_esop20 :: Maybe Text
line_60450_esop20 :: Maybe Centi
line87_evcc30 :: Maybe Text
line_60470_evcc30 :: Maybe Centi
line88_sum :: SubCalculation Maybe
line89_difference :: Maybe Centi
line90_mining :: Maybe Centi
line91_tax :: Maybe Centi
line91_tax :: forall (line :: * -> *). Page3 line -> line Centi
line90_mining :: forall (line :: * -> *). Page3 line -> line Centi
line89_difference :: forall (line :: * -> *). Page3 line -> line Centi
line88_sum :: forall (line :: * -> *). Page3 line -> SubCalculation line
line_60470_evcc30 :: forall (line :: * -> *). Page3 line -> line Centi
line87_evcc30 :: forall (line :: * -> *). Page3 line -> line Text
line_60450_esop20 :: forall (line :: * -> *). Page3 line -> line Centi
line86_esop20 :: forall (line :: * -> *). Page3 line -> line Text
line85_difference :: forall (line :: * -> *). Page3 line -> line Centi
line84_political :: forall (line :: * -> *). Page3 line -> line Centi
line83_political :: forall (line :: * -> *). Page3 line -> line Centi
line82_difference :: forall (line :: * -> *). Page3 line -> line Centi
line81_logging :: forall (line :: * -> *). Page3 line -> line Centi
line80_difference :: forall (line :: * -> *). Page3 line -> line Centi
line79_difference :: forall (line :: * -> *). Page3 line -> SubCalculation line
line78_fraction :: forall (line :: * -> *). Page3 line -> SubCalculation line
line77_rate :: forall (line :: * -> *). Page3 line -> line Rational
line76_difference :: forall (line :: * -> *). Page3 line -> line Centi
line75_base :: forall (line :: * -> *). Page3 line -> line Centi
line74_copy :: forall (line :: * -> *). Page3 line -> line Centi
line73_basicReduction :: forall (line :: * -> *). Page3 line -> line Centi
partC :: forall (line :: * -> *). Page3 line -> PartC line
..}-> Page3 Maybe
page{
   partC = fixPartC bc428 partC,
   line73_basicReduction = Just 547,
   line76_difference = nonNegativeDifference line74_copy line75_base,
   line78_fraction = fixSubCalculation id $ line77_rate `fractionOf` line76_difference,
   line79_difference = fixSubCalculation id $ nonNegativeDifference line73_basicReduction line78_fraction.result,
   line80_difference = nonNegativeDifference partC.line72 line79_difference.result,
   line82_difference = nonNegativeDifference line80_difference line81_logging,
   line85_difference = nonNegativeDifference line82_difference line84_political,
   line88_sum = fixSubCalculation id $ min 2000 <$> totalOf [line_60450_esop20, line_60470_evcc30],
   line89_difference = nonNegativeDifference line85_difference line88_sum.result,
   line91_tax = nonNegativeDifference line89_difference line90_mining}