{-# 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
$sel:page1:ON479 :: forall (line :: * -> *). ON479 line -> Page1 line
$sel:page2:ON479 :: forall (line :: * -> *). ON479 line -> Page2 line
..}-> ON479{$sel:page1:ON479 :: Page1 Maybe
page1 = Page1 Maybe -> Page1 Maybe
fixPage1 Page1 Maybe
page1,
                                            $sel:page2:ON479 :: 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
$sel:line_63050_childcare:Page1 :: forall (line :: * -> *). Page1 line -> line Centi
$sel:line4_homecare_copy:Page1 :: forall (line :: * -> *). Page1 line -> line Centi
$sel:line5_allowable:Page1 :: forall (line :: * -> *). Page1 line -> line Rational
$sel:line6_fraction:Page1 :: forall (line :: * -> *). Page1 line -> line Centi
$sel:line7_netIncome_copy:Page1 :: forall (line :: * -> *). Page1 line -> line Centi
$sel:line8_spouse_copy:Page1 :: forall (line :: * -> *). Page1 line -> line Centi
$sel:line9_sum:Page1 :: forall (line :: * -> *). Page1 line -> line Centi
$sel:line10_base:Page1 :: forall (line :: * -> *). Page1 line -> line Centi
$sel:line11_difference:Page1 :: forall (line :: * -> *). Page1 line -> line Centi
$sel:line12_rate:Page1 :: forall (line :: * -> *). Page1 line -> line Rational
$sel:line13_fraction:Page1 :: forall (line :: * -> *). Page1 line -> SubCalculation line
$sel:line_63095_difference:Page1 :: forall (line :: * -> *). Page1 line -> SubCalculation line
$sel:line_63100_transit:Page1 :: forall (line :: * -> *). Page1 line -> line Centi
$sel:line_63100_fraction:Page1 :: forall (line :: * -> *). Page1 line -> line Centi
$sel:line16_sum:Page1 :: 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 $ line12_rate `fractionOf` line11_difference,
   line_63095_difference = fixSubCalculation $ 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
$sel:line17_copy:Page2 :: forall (line :: * -> *). Page2 line -> line Centi
$sel:line_63110_contributions:Page2 :: forall (line :: * -> *). Page2 line -> line Centi
$sel:line_63110_credit:Page2 :: forall (line :: * -> *). Page2 line -> line Centi
$sel:line_63220_fromT1221:Page2 :: forall (line :: * -> *). Page2 line -> line Centi
$sel:line_63220_fraction:Page2 :: forall (line :: * -> *). Page2 line -> line Centi
$sel:line_63260_placements:Page2 :: forall (line :: * -> *). Page2 line -> line Word
$sel:line_63265_partnership:Page2 :: forall (line :: * -> *). Page2 line -> line Bool
$sel:line_63270_business:Page2 :: forall (line :: * -> *). Page2 line -> line Text
$sel:line_63300_total:Page2 :: forall (line :: * -> *). Page2 line -> line Centi
$sel:line23_credits:Page2 :: forall (line :: * -> *). Page2 line -> line Centi
..}-> Page2 Maybe
page2{
   line17_copy = on479.page1.line16_sum,
   line_63110_credit = if line_63110_contributions >= Just 3531 then Just 1552 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]}