{-# 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.BC.BC479.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 BC479 line = BC479 {
   forall (line :: * -> *). BC479 line -> Page1 line
page1 :: Page1 line,
   forall (line :: * -> *). BC479 line -> Page2 line
page2 :: Page2 line,
   forall (line :: * -> *). BC479 line -> Page3 line
page3 :: Page3 line}

data Page1 line = Page1 {
   forall (line :: * -> *). Page1 line -> line Centi
line1_netIncome_self :: line Centi,
   forall (line :: * -> *). Page1 line -> line Centi
line1_netIncome_spouse :: line Centi,
   forall (line :: * -> *). Page1 line -> line Centi
line2_uccb_rdsp_repayment_self :: line Centi,
   forall (line :: * -> *). Page1 line -> line Centi
line2_uccb_rdsp_repayment_spouse :: line Centi,
   forall (line :: * -> *). Page1 line -> line Centi
line3_sum_self :: line Centi,
   forall (line :: * -> *). Page1 line -> line Centi
line3_sum_spouse :: line Centi,
   forall (line :: * -> *). Page1 line -> line Centi
line4_uccb_rdsp_income_self :: line Centi,
   forall (line :: * -> *). Page1 line -> line Centi
line4_uccb_rdsp_income_spouse :: line Centi,
   forall (line :: * -> *). Page1 line -> line Centi
line5_difference_self :: line Centi,
   forall (line :: * -> *). Page1 line -> line Centi
line5_difference_spouse :: line Centi,
   forall (line :: * -> *). Page1 line -> line Centi
line6_sum :: line Centi,
   forall (line :: * -> *). Page1 line -> line Centi
line7_threshold :: line Centi,
   forall (line :: * -> *). Page1 line -> line Centi
line8_difference :: line Centi,
   forall (line :: * -> *). Page1 line -> line Centi
line_60330_sales :: line Centi,
   forall (line :: * -> *). Page1 line -> line Centi
line_60350_spouse :: line Centi,
   forall (line :: * -> *). Page1 line -> line Centi
line11_sum :: line Centi,
   forall (line :: * -> *). Page1 line -> line Centi
line12_copy :: line Centi,
   forall (line :: * -> *). Page1 line -> line Centi
line12_fraction :: line Centi,
   forall (line :: * -> *). Page1 line -> line Centi
line13_difference :: line Centi,
   forall (line :: * -> *). Page1 line -> line Bool
line_60890_separate :: line Bool,
   forall (line :: * -> *). Page1 line -> line Centi
line_60480_renovation :: line Centi,
   forall (line :: * -> *). Page1 line -> line Centi
line14_fraction :: line Centi,
   forall (line :: * -> *). Page1 line -> line Centi
line15_sum :: line Centi}

data Page2 line = Page2 {
   forall (line :: * -> *). Page2 line -> line Centi
line16_copy :: line Centi,
   forall (line :: * -> *). Page2 line -> line Centi
line17_venture :: line Centi,
   forall (line :: * -> *). Page2 line -> line Centi
line_60490_shares :: line Centi,
   forall (line :: * -> *). Page2 line -> line Text
line_60491_certificate :: line Text,
   forall (line :: * -> *). Page2 line -> line Centi
line_60495_shares :: line Centi,
   forall (line :: * -> *). Page2 line -> line Text
line_60496_certificate :: line Text,
   forall (line :: * -> *). Page2 line -> SubCalculation line
line22_sum :: SubCalculation line,
   forall (line :: * -> *). Page2 line -> line Centi
line_60510_fromT88 :: line Centi,
   forall (line :: * -> *). Page2 line -> line Centi
line_60530_fromT88 :: line Centi,
   forall (line :: * -> *). Page2 line -> line Centi
line_60545_buildings :: line Centi,
   forall (line :: * -> *). Page2 line -> line Centi
line_60546_partnership :: line Centi,
   forall (line :: * -> *). Page2 line -> SubCalculation line
line27_sum :: SubCalculation line,
   forall (line :: * -> *). Page2 line -> line Centi
line_60550_training :: line Centi,
   forall (line :: * -> *). Page2 line -> line Centi
line_60560_training :: line Centi,
   forall (line :: * -> *). Page2 line -> line Centi
line_60570_ships :: line Centi,
   forall (line :: * -> *). Page2 line -> SubCalculation line
line31_sum :: SubCalculation line,
   forall (line :: * -> *). Page2 line -> line Centi
line32_credits :: line Centi}

data Page3 line = Page3 {
   forall (line :: * -> *). Page3 line -> line Centi
line33_copy :: line Centi,
   forall (line :: * -> *). Page3 line -> line Word
tenancy_months1 :: line Word,
   forall (line :: * -> *). Page3 line -> line Word
tenancy_months2 :: line Word,
   forall (line :: * -> *). Page3 line -> line Centi
rent_paid1 :: line Centi,
   forall (line :: * -> *). Page3 line -> line Centi
rent_paid2 :: line Centi,
   forall (line :: * -> *). Page3 line -> line Word
line_60575_sum :: line Word,
   forall (line :: * -> *). Page3 line -> line Centi
line35_ceiling :: line Centi,
   forall (line :: * -> *). Page3 line -> line Centi
line36_income_copy :: line Centi,
   forall (line :: * -> *). Page3 line -> line Centi
line37_threshold :: line Centi,
   forall (line :: * -> *). Page3 line -> line Centi
line38_difference :: line Centi,
   forall (line :: * -> *). Page3 line -> line Rational
line39_rate :: line Rational,
   forall (line :: * -> *). Page3 line -> SubCalculation line
line40_fraction :: SubCalculation line,
   forall (line :: * -> *). Page3 line -> SubCalculation line
line_60576_difference :: SubCalculation line,
   forall (line :: * -> *). Page3 line -> line Centi
line42_credits :: line Centi}

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