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

module Tax.Canada.Province.MB.MB428.Fix (MB428, fixMB428) where

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

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

fixMB428 :: MB428 Maybe -> MB428 Maybe
fixMB428 :: MB428 Maybe -> MB428 Maybe
fixMB428 = (MB428 Maybe -> MB428 Maybe) -> MB428 Maybe -> MB428 Maybe
forall a. Eq a => (a -> a) -> a -> a
fixEq ((MB428 Maybe -> MB428 Maybe) -> MB428 Maybe -> MB428 Maybe)
-> (MB428 Maybe -> MB428 Maybe) -> MB428 Maybe -> MB428 Maybe
forall a b. (a -> b) -> a -> b
$ \mb428 :: MB428 Maybe
mb428@MB428{Page3 Maybe
Page2 Maybe
Page1 Maybe
page1 :: Page1 Maybe
page2 :: Page2 Maybe
page3 :: Page3 Maybe
$sel:page1:MB428 :: forall (line :: * -> *). MB428 line -> Page1 line
$sel:page2:MB428 :: forall (line :: * -> *). MB428 line -> Page2 line
$sel:page3:MB428 :: forall (line :: * -> *). MB428 line -> Page3 line
..}-> MB428{$sel:page1:MB428 :: Page1 Maybe
page1 = Page1 Maybe -> Page1 Maybe
fixPage1 Page1 Maybe
page1,
                                            $sel:page2:MB428 :: Page2 Maybe
page2 = MB428 Maybe -> Page2 Maybe -> Page2 Maybe
fixPage2 MB428 Maybe
mb428 Page2 Maybe
page2,
                                            $sel:page3:MB428 :: Page3 Maybe
page3 = MB428 Maybe -> Page3 Maybe -> Page3 Maybe
fixPage3 MB428 Maybe
mb428 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
$sel:income:Page1 :: forall (line :: * -> *). Page1 line -> line Centi
$sel:partA:Page1 :: forall (line :: * -> *). Page1 line -> Page1PartA line
$sel:partB:Page1 :: forall (line :: * -> *). Page1 line -> Page1PartB line
..}-> Page1{
   $sel:income:Page1 :: Maybe Centi
income = Maybe Centi
income,
   $sel:partA:Page1 :: Page1PartA Maybe
partA = Maybe Centi -> Page1PartA Maybe -> Page1PartA Maybe
fixPage1PartA Maybe Centi
income Page1PartA Maybe
partA,
   $sel:partB:Page1 :: 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
$sel:column1:Page1PartA :: forall (line :: * -> *). Page1PartA line -> TaxIncomeBracket line
$sel:column2:Page1PartA :: forall (line :: * -> *). Page1PartA line -> TaxIncomeBracket line
$sel:column3:Page1PartA :: forall (line :: * -> *). Page1PartA line -> TaxIncomeBracket line
..}-> Page1PartA{
   $sel:column1:Page1PartA :: 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,
   $sel:column2:Page1PartA :: 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,
   $sel:column3:Page1PartA :: TaxIncomeBracket Maybe
column3 = Maybe Centi
-> Maybe (TaxIncomeBracket Maybe)
-> TaxIncomeBracket Maybe
-> TaxIncomeBracket Maybe
fixTaxIncomeBracket Maybe Centi
income Maybe (TaxIncomeBracket Maybe)
forall a. Maybe a
Nothing TaxIncomeBracket Maybe
column3}

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_firefighters :: Maybe Centi
line24_rescue :: Maybe Centi
line25_fitness :: Maybe Centi
line26_arts :: Maybe Centi
line27_adoption :: Maybe Centi
line28_sum :: SubCalculation Maybe
line29 :: Maybe Centi
$sel:line9_basic:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi
$sel:line10_age:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi
$sel:spouseAmount:Page1PartB :: forall (line :: * -> *). Page1PartB line -> BaseCredit line
$sel:dependantAmount:Page1PartB :: forall (line :: * -> *). Page1PartB line -> BaseCredit line
$sel:line17_infirm:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi
$sel:line18:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi
$sel:line19_cppQpp:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi
$sel:line20_cppQpp:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi
$sel:line21_employmentInsurance:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi
$sel:line22_employmentInsurance:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi
$sel:line23_firefighters:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi
$sel:line24_rescue:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi
$sel:line25_fitness:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi
$sel:line26_arts:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi
$sel:line27_adoption:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi
$sel:line28_sum:Page1PartB :: forall (line :: * -> *). Page1PartB line -> SubCalculation line
$sel:line29:Page1PartB :: forall (line :: * -> *). Page1PartB line -> line Centi
..}-> Page1PartB Maybe
part{
   line9_basic = Just 15000,
   spouseAmount = fixBaseCredit spouseAmount,
   dependantAmount = fixBaseCredit dependantAmount,
   line18 = totalOf [line9_basic, line10_age, spouseAmount.cont, dependantAmount.cont, line17_infirm],
   line28_sum = fixSubCalculation $
                totalOf [line19_cppQpp,
                         line20_cppQpp,
                         line21_employmentInsurance,
                         line22_employmentInsurance,
                         line23_firefighters,
                         line24_rescue,
                         line25_fitness,
                         line26_arts,
                         line27_adoption],
   line29 = totalOf [line18, line28_sum.result]}

fixPage2 :: MB428 Maybe -> Page2 Maybe -> Page2 Maybe
fixPage2 :: MB428 Maybe -> Page2 Maybe -> Page2 Maybe
fixPage2 MB428 Maybe
mb428 = (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
$sel:partB:Page2 :: forall (line :: * -> *). Page2 line -> Page2PartB line
..}-> Page2{
  $sel:partB:Page2 :: Page2PartB Maybe
partB = MB428 Maybe -> Page2PartB Maybe -> Page2PartB Maybe
fixPage2PartB MB428 Maybe
mb428 Page2PartB Maybe
partB}

fixPage2PartB :: MB428 Maybe -> Page2PartB Maybe -> Page2PartB Maybe
fixPage2PartB :: MB428 Maybe -> Page2PartB Maybe -> Page2PartB Maybe
fixPage2PartB MB428 Maybe
mb428 = (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
line30 :: Maybe Centi
line31_pension :: Maybe Centi
line32_caregiver :: Maybe Centi
line33 :: Maybe Centi
line34_disability :: Maybe Centi
line35 :: Maybe Centi
line36 :: Maybe Centi
line37_interest :: Maybe Centi
line38_education :: Maybe Centi
line39_transferredChild :: Maybe Centi
line40_transferredSpouse :: Maybe Centi
line41_family :: Maybe Centi
line42_sum :: Maybe Centi
medicalExpenses :: MedicalExpenses Maybe
line49 :: Maybe Centi
line50_sum :: SubCalculation Maybe
line51 :: Maybe Centi
line52_rate :: Maybe Rational
line53_fraction :: Maybe Centi
donations :: Donations Maybe
line56_sum :: SubCalculation Maybe
line57 :: Maybe Centi
$sel:line30:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi
$sel:line31_pension:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi
$sel:line32_caregiver:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi
$sel:line33:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi
$sel:line34_disability:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi
$sel:line35:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi
$sel:line36:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi
$sel:line37_interest:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi
$sel:line38_education:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi
$sel:line39_transferredChild:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi
$sel:line40_transferredSpouse:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi
$sel:line41_family:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi
$sel:line42_sum:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi
$sel:medicalExpenses:Page2PartB :: forall (line :: * -> *). Page2PartB line -> MedicalExpenses line
$sel:line49:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi
$sel:line50_sum:Page2PartB :: forall (line :: * -> *). Page2PartB line -> SubCalculation line
$sel:line51:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi
$sel:line52_rate:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Rational
$sel:line53_fraction:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi
$sel:donations:Page2PartB :: forall (line :: * -> *). Page2PartB line -> Donations line
$sel:line56_sum:Page2PartB :: forall (line :: * -> *). Page2PartB line -> SubCalculation line
$sel:line57:Page2PartB :: forall (line :: * -> *). Page2PartB line -> line Centi
..}-> Page2PartB Maybe
part{
   line30 = mb428.page1.partB.line29,
   line33 = totalOf [line30, line31_pension, line32_caregiver],
   line36 = totalOf [line33, line34_disability, line35],
   line42_sum = totalOf [line36,
                         line37_interest,
                         line38_education,
                         line39_transferredChild,
                         line40_transferredSpouse,
                         line41_family],
   medicalExpenses = fixMedicalExpenses 1728 medicalExpenses,
   line50_sum = fixSubCalculation $ totalOf [medicalExpenses.difference, line49],
   line51 = totalOf [line42_sum, line50_sum.result],
   line53_fraction = line52_rate `fractionOf` line51,
   donations = fixDonations donations,
   line56_sum = fixSubCalculation $ totalOf [donations.line54_fraction, donations.line55_fraction],
   line57 = totalOf [line53_fraction, line56_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
line54_base :: Maybe Centi
line54_fraction :: Maybe Centi
line55_base :: Maybe Centi
line55_fraction :: Maybe Centi
$sel:line54_base:Donations :: forall (line :: * -> *). Donations line -> line Centi
$sel:line54_fraction:Donations :: forall (line :: * -> *). Donations line -> line Centi
$sel:line55_base:Donations :: forall (line :: * -> *). Donations line -> line Centi
$sel:line55_fraction:Donations :: forall (line :: * -> *). Donations line -> line Centi
..} -> Donations Maybe
part{
   line54_fraction = Just 0.108 `fractionOf` line54_base,
   line55_fraction = Just 0.174 `fractionOf` line55_base}

fixPage3 :: MB428 Maybe -> Page3 Maybe -> Page3 Maybe
fixPage3 :: MB428 Maybe -> Page3 Maybe -> Page3 Maybe
fixPage3 MB428 Maybe
mb428 = (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
$sel:partC:Page3 :: forall (line :: * -> *). Page3 line -> PartC line
..}-> Page3 Maybe
page{
   partC = fixPartC mb428 partC}

fixPartC :: MB428 Maybe -> PartC Maybe -> PartC Maybe
fixPartC :: MB428 Maybe -> PartC Maybe -> PartC Maybe
fixPartC MB428 Maybe
mb428 = (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
line58_tax :: Maybe Centi
line59_splitIncomeTax :: Maybe Centi
line60 :: Maybe Centi
line61_copy :: Maybe Centi
line62_dividendCredits :: Maybe Centi
line63_copy :: Maybe Centi
line63_fraction :: Maybe Centi
line64_sum :: SubCalculation Maybe
line65_difference :: Maybe Centi
line66_fromT691 :: Maybe Centi
line66_fraction :: Maybe Centi
line67 :: Maybe Centi
line68_political :: Maybe Centi
line69_political :: Maybe Centi
line70_difference :: Maybe Centi
line71_labour :: Maybe Centi
line72_difference :: Maybe Centi
line73_foreignCredit :: Maybe Centi
line74_difference :: Maybe Centi
line75_community :: Maybe Centi
line76_difference :: Maybe Centi
line77_venture :: Maybe Centi
line78_difference :: Maybe Centi
line79_sharePurchase :: Maybe Centi
line80_difference :: Maybe Centi
line81_mineral :: Maybe Centi
line82_tax :: Maybe Centi
$sel:line58_tax:PartC :: forall (line :: * -> *). PartC line -> line Centi
$sel:line59_splitIncomeTax:PartC :: forall (line :: * -> *). PartC line -> line Centi
$sel:line60:PartC :: forall (line :: * -> *). PartC line -> line Centi
$sel:line61_copy:PartC :: forall (line :: * -> *). PartC line -> line Centi
$sel:line62_dividendCredits:PartC :: forall (line :: * -> *). PartC line -> line Centi
$sel:line63_copy:PartC :: forall (line :: * -> *). PartC line -> line Centi
$sel:line63_fraction:PartC :: forall (line :: * -> *). PartC line -> line Centi
$sel:line64_sum:PartC :: forall (line :: * -> *). PartC line -> SubCalculation line
$sel:line65_difference:PartC :: forall (line :: * -> *). PartC line -> line Centi
$sel:line66_fromT691:PartC :: forall (line :: * -> *). PartC line -> line Centi
$sel:line66_fraction:PartC :: forall (line :: * -> *). PartC line -> line Centi
$sel:line67:PartC :: forall (line :: * -> *). PartC line -> line Centi
$sel:line68_political:PartC :: forall (line :: * -> *). PartC line -> line Centi
$sel:line69_political:PartC :: forall (line :: * -> *). PartC line -> line Centi
$sel:line70_difference:PartC :: forall (line :: * -> *). PartC line -> line Centi
$sel:line71_labour:PartC :: forall (line :: * -> *). PartC line -> line Centi
$sel:line72_difference:PartC :: forall (line :: * -> *). PartC line -> line Centi
$sel:line73_foreignCredit:PartC :: forall (line :: * -> *). PartC line -> line Centi
$sel:line74_difference:PartC :: forall (line :: * -> *). PartC line -> line Centi
$sel:line75_community:PartC :: forall (line :: * -> *). PartC line -> line Centi
$sel:line76_difference:PartC :: forall (line :: * -> *). PartC line -> line Centi
$sel:line77_venture:PartC :: forall (line :: * -> *). PartC line -> line Centi
$sel:line78_difference:PartC :: forall (line :: * -> *). PartC line -> line Centi
$sel:line79_sharePurchase:PartC :: forall (line :: * -> *). PartC line -> line Centi
$sel:line80_difference:PartC :: forall (line :: * -> *). PartC line -> line Centi
$sel:line81_mineral:PartC :: forall (line :: * -> *). PartC line -> line Centi
$sel:line82_tax:PartC :: forall (line :: * -> *). PartC line -> line Centi
..}-> PartC Maybe
part{
   line58_tax = totalOf [mb428.page1.partA.column1.equalsTax,
                         mb428.page1.partA.column2.equalsTax,
                         mb428.page1.partA.column3.equalsTax],
   line60 = totalOf [line58_tax, line59_splitIncomeTax],
   line61_copy = mb428.page2.partB.line57,
   line63_fraction = Just 0.5 `fractionOf` line63_copy,
   line64_sum = fixSubCalculation $ totalOf [line61_copy, line62_dividendCredits, line63_fraction],
   line65_difference = nonNegativeDifference line60 line64_sum.result,
   line66_fraction = Just 0.5 `fractionOf` line66_fromT691,
   line67 = totalOf [line65_difference, line66_fraction],
   line70_difference = nonNegativeDifference line67 line69_political,
   line72_difference = nonNegativeDifference line70_difference line71_labour,
   line74_difference = nonNegativeDifference line72_difference line73_foreignCredit,
   line76_difference = nonNegativeDifference line74_difference line75_community,
   line78_difference = nonNegativeDifference line76_difference line77_venture,
   line80_difference = nonNegativeDifference line78_difference line79_sharePurchase,
   line82_tax = nonNegativeDifference line80_difference line81_mineral}