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

module Tax.Canada.Province.ON.ON479.Fix (ON479, fixON479) where

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

import Tax.Canada.Province.ON.ON479.Types
import Tax.Canada.Shared (fixSubCalculation, SubCalculation(result))
import Tax.Util (fixEq, fractionOf, nonNegativeDifference, totalOf)

fixON479 :: ON479 Maybe -> ON479 Maybe
fixON479 :: ON479 Maybe -> ON479 Maybe
fixON479 = (ON479 Maybe -> ON479 Maybe) -> ON479 Maybe -> ON479 Maybe
forall a. Eq a => (a -> a) -> a -> a
fixEq ((ON479 Maybe -> ON479 Maybe) -> ON479 Maybe -> ON479 Maybe)
-> (ON479 Maybe -> ON479 Maybe) -> ON479 Maybe -> ON479 Maybe
forall a b. (a -> b) -> a -> b
$ \on479 :: ON479 Maybe
on479@ON479{Page2 Maybe
Page1 Maybe
page1 :: Page1 Maybe
page2 :: Page2 Maybe
page2 :: forall (line :: * -> *). ON479 line -> Page2 line
page1 :: forall (line :: * -> *). ON479 line -> Page1 line
..}-> ON479{page1 :: Page1 Maybe
page1 = Page1 Maybe -> Page1 Maybe
fixPage1 Page1 Maybe
page1,
                                            page2 :: Page2 Maybe
page2 = ON479 Maybe -> Page2 Maybe -> Page2 Maybe
fixPage2 ON479 Maybe
on479 Page2 Maybe
page2}

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
$ \page :: Page1 Maybe
page@Page1{Maybe Rational
Maybe Centi
SubCalculation Maybe
line_63050_childcare :: Maybe Centi
line4_homecare_copy :: Maybe Centi
line5_allowable :: Maybe Rational
line6_fraction :: Maybe Centi
line7_netIncome_copy :: Maybe Centi
line8_spouse_copy :: Maybe Centi
line9_sum :: Maybe Centi
line10_base :: Maybe Centi
line11_difference :: Maybe Centi
line12_rate :: Maybe Rational
line13_fraction :: SubCalculation Maybe
line_63095_difference :: SubCalculation Maybe
line_63100_transit :: Maybe Centi
line_63100_fraction :: Maybe Centi
line16_sum :: Maybe Centi
line16_sum :: forall (line :: * -> *). Page1 line -> line Centi
line_63100_fraction :: forall (line :: * -> *). Page1 line -> line Centi
line_63100_transit :: forall (line :: * -> *). Page1 line -> line Centi
line_63095_difference :: forall (line :: * -> *). Page1 line -> SubCalculation line
line13_fraction :: forall (line :: * -> *). Page1 line -> SubCalculation line
line12_rate :: forall (line :: * -> *). Page1 line -> line Rational
line11_difference :: forall (line :: * -> *). Page1 line -> line Centi
line10_base :: forall (line :: * -> *). Page1 line -> line Centi
line9_sum :: forall (line :: * -> *). Page1 line -> line Centi
line8_spouse_copy :: forall (line :: * -> *). Page1 line -> line Centi
line7_netIncome_copy :: forall (line :: * -> *). Page1 line -> line Centi
line6_fraction :: forall (line :: * -> *). Page1 line -> line Centi
line5_allowable :: forall (line :: * -> *). Page1 line -> line Rational
line4_homecare_copy :: forall (line :: * -> *). Page1 line -> line Centi
line_63050_childcare :: forall (line :: * -> *). Page1 line -> line Centi
..}-> Page1 Maybe
page{
   line6_fraction = line5_allowable `fractionOf` line4_homecare_copy,
   line9_sum = totalOf [line7_netIncome_copy, line8_spouse_copy],
   line11_difference = nonNegativeDifference line9_sum line10_base,
   line13_fraction = fixSubCalculation id $ line12_rate `fractionOf` line11_difference,
   line_63095_difference = fixSubCalculation id $ nonNegativeDifference line6_fraction line13_fraction.result,
   line_63100_fraction = (0.15 *) <$> line_63100_transit,
   line16_sum = totalOf [line_63050_childcare, line_63095_difference.result, line_63100_fraction]}

fixPage2 :: ON479 Maybe -> Page2 Maybe -> Page2 Maybe
fixPage2 :: ON479 Maybe -> Page2 Maybe -> Page2 Maybe
fixPage2 ON479 Maybe
on479 = (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 :: Page2 Maybe
page2@Page2{Maybe Bool
Maybe Word
Maybe Text
Maybe Centi
line17_copy :: Maybe Centi
line_63110_contributions :: Maybe Centi
line_63110_credit :: Maybe Centi
line_63220_fromT1221 :: Maybe Centi
line_63220_fraction :: Maybe Centi
line_63260_placements :: Maybe Word
line_63265_partnership :: Maybe Bool
line_63270_business :: Maybe Text
line_63300_total :: Maybe Centi
line23_credits :: Maybe Centi
line23_credits :: forall (line :: * -> *). Page2 line -> line Centi
line_63300_total :: forall (line :: * -> *). Page2 line -> line Centi
line_63270_business :: forall (line :: * -> *). Page2 line -> line Text
line_63265_partnership :: forall (line :: * -> *). Page2 line -> line Bool
line_63260_placements :: forall (line :: * -> *). Page2 line -> line Word
line_63220_fraction :: forall (line :: * -> *). Page2 line -> line Centi
line_63220_fromT1221 :: forall (line :: * -> *). Page2 line -> line Centi
line_63110_credit :: forall (line :: * -> *). Page2 line -> line Centi
line_63110_contributions :: forall (line :: * -> *). Page2 line -> line Centi
line17_copy :: forall (line :: * -> *). Page2 line -> line Centi
..}-> Page2 Maybe
page2{
   line17_copy = on479.page1.line16_sum,
   line_63110_credit = if line_63110_contributions >= Just 3691 then Just 1622.08 else line_63110_credit, -- TODO worksheet?
   line_63220_fraction = (0.05 *) <$> line_63220_fromT1221,
   line23_credits = totalOf [line17_copy, line_63110_credit, line_63220_fraction, line_63300_total]}