{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE InstanceSigs #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE NoFieldSelectors #-}
{-# LANGUAGE OverloadedRecordDot #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE StandaloneDeriving #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE UndecidableInstances #-}

module Tax.Canada.Province.ON.ON479.Types where

import Data.Fixed (Centi)
import Data.Text (Text)
import Language.Haskell.TH qualified as TH
import Rank2.TH qualified
import Transformation.Shallow.TH qualified

import Tax.Canada.Shared (SubCalculation)

data ON479 line = ON479 {
   forall (line :: * -> *). ON479 line -> Page1 line
page1 :: Page1 line,
   forall (line :: * -> *). ON479 line -> Page2 line
page2 :: Page2 line}

data Page1 line = Page1 {
   forall (line :: * -> *). Page1 line -> line Centi
line_63050_childcare :: line Centi,
   forall (line :: * -> *). Page1 line -> line Centi
line4_homecare_copy :: line Centi,
   forall (line :: * -> *). Page1 line -> line Rational
line5_allowable :: line Rational,
   forall (line :: * -> *). Page1 line -> line Centi
line6_fraction :: line Centi,
   forall (line :: * -> *). Page1 line -> line Centi
line7_netIncome_copy :: line Centi,
   forall (line :: * -> *). Page1 line -> line Centi
line8_spouse_copy :: line Centi,
   forall (line :: * -> *). Page1 line -> line Centi
line9_sum :: line Centi,
   forall (line :: * -> *). Page1 line -> line Centi
line10_base :: line Centi,
   forall (line :: * -> *). Page1 line -> line Centi
line11_difference :: line Centi,
   forall (line :: * -> *). Page1 line -> line Rational
line12_rate :: line Rational,
   forall (line :: * -> *). Page1 line -> SubCalculation line
line13_fraction :: SubCalculation line,
   forall (line :: * -> *). Page1 line -> SubCalculation line
line_63095_difference :: SubCalculation line,
   forall (line :: * -> *). Page1 line -> line Centi
line_63100_transit :: line Centi,
   forall (line :: * -> *). Page1 line -> line Centi
line_63100_fraction :: line Centi,
   forall (line :: * -> *). Page1 line -> line Centi
line16_sum :: line Centi}

data Page2 line = Page2 {
   forall (line :: * -> *). Page2 line -> line Centi
line17_copy :: line Centi,
   forall (line :: * -> *). Page2 line -> line Centi
line_63110_contributions :: line Centi,
   forall (line :: * -> *). Page2 line -> line Centi
line_63110_credit :: line Centi,
   forall (line :: * -> *). Page2 line -> line Centi
line_63220_fromT1221 :: line Centi,
   forall (line :: * -> *). Page2 line -> line Centi
line_63220_fraction :: line Centi,
   forall (line :: * -> *). Page2 line -> line Word
line_63260_placements :: line Word,
   forall (line :: * -> *). Page2 line -> line Bool
line_63265_partnership :: line Bool,
   forall (line :: * -> *). Page2 line -> line Text
line_63270_business :: line Text,
   forall (line :: * -> *). Page2 line -> line Centi
line_63300_total :: line Centi,
   forall (line :: * -> *). Page2 line -> line Centi
line23_credits :: line Centi}

$(foldMap
   (\t-> concat <$> sequenceA [
       [d|
           deriving instance (Show (line Bool), Show (line Centi), Show (line Rational), Show (line Text), Show (line Word))
                          => Show ($(TH.conT t) line)
           deriving instance (Eq (line Bool), Eq (line Centi), Eq (line Rational), Eq (line Text), Eq (line Word))
                          => Eq ($(TH.conT t) line)
       |],
       Rank2.TH.deriveAll t,
       Transformation.Shallow.TH.deriveAll t])
   [''ON479, ''Page1, ''Page2])