{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE DeriveGeneric #-}

module Triggers(
    Trigger(..),TriggerEffect(..),TriggerName,trgStatusLens
)
 where

import qualified Data.Text as T
import qualified Stmt as S
import qualified Liability as L
import Text.Read (readMaybe)
import Lib 
import Types
import Accounts (ReserveAmount)
import Waterfall (Action,CollectionRule)
import Data.Aeson ( defaultOptions )
import Language.Haskell.TH
import Data.Aeson.TH
import Data.Aeson.Types
import Data.Fixed
import Data.Maybe
import Data.Map
import GHC.Generics
import Control.Lens
-- import qualified Liability as L

type TriggerName = String


data TriggerEffect = DealStatusTo DealStatus                           -- ^ change deal status
                   | DoAccrueFee FeeNames                              -- ^ accure fee
                   | AddTrigger Trigger                                -- ^ add a new trigger
                   | ChangeReserveBalance String ReserveAmount         -- ^ update reserve target balance  
                   | CloseDeal (Int, DatePattern) (Int, DatePattern)
                               (PricingMethod, AccountName, Maybe DealStats)   
                               (Maybe [CollectionRule])
                               -- ^ close the deal
                   | BuyAsset AccountName PricingMethod                -- ^ buy asset from the assumption using funds from account
                   | ChangeBondRate BondName L.InterestInfo IRate      -- ^ change bond rate
                   | TriggerEffects [TriggerEffect]                    -- ^ a combination of effects above
                   | RunActions [Action]                               -- ^ run a list of waterfall actions
                   | DoNothing                                         -- ^ do nothing
                   deriving (Int -> TriggerEffect -> ShowS
[TriggerEffect] -> ShowS
TriggerEffect -> String
(Int -> TriggerEffect -> ShowS)
-> (TriggerEffect -> String)
-> ([TriggerEffect] -> ShowS)
-> Show TriggerEffect
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> TriggerEffect -> ShowS
showsPrec :: Int -> TriggerEffect -> ShowS
$cshow :: TriggerEffect -> String
show :: TriggerEffect -> String
$cshowList :: [TriggerEffect] -> ShowS
showList :: [TriggerEffect] -> ShowS
Show, TriggerEffect -> TriggerEffect -> Bool
(TriggerEffect -> TriggerEffect -> Bool)
-> (TriggerEffect -> TriggerEffect -> Bool) -> Eq TriggerEffect
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: TriggerEffect -> TriggerEffect -> Bool
== :: TriggerEffect -> TriggerEffect -> Bool
$c/= :: TriggerEffect -> TriggerEffect -> Bool
/= :: TriggerEffect -> TriggerEffect -> Bool
Eq, (forall x. TriggerEffect -> Rep TriggerEffect x)
-> (forall x. Rep TriggerEffect x -> TriggerEffect)
-> Generic TriggerEffect
forall x. Rep TriggerEffect x -> TriggerEffect
forall x. TriggerEffect -> Rep TriggerEffect x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. TriggerEffect -> Rep TriggerEffect x
from :: forall x. TriggerEffect -> Rep TriggerEffect x
$cto :: forall x. Rep TriggerEffect x -> TriggerEffect
to :: forall x. Rep TriggerEffect x -> TriggerEffect
Generic,Eq TriggerEffect
Eq TriggerEffect =>
(TriggerEffect -> TriggerEffect -> Ordering)
-> (TriggerEffect -> TriggerEffect -> Bool)
-> (TriggerEffect -> TriggerEffect -> Bool)
-> (TriggerEffect -> TriggerEffect -> Bool)
-> (TriggerEffect -> TriggerEffect -> Bool)
-> (TriggerEffect -> TriggerEffect -> TriggerEffect)
-> (TriggerEffect -> TriggerEffect -> TriggerEffect)
-> Ord TriggerEffect
TriggerEffect -> TriggerEffect -> Bool
TriggerEffect -> TriggerEffect -> Ordering
TriggerEffect -> TriggerEffect -> TriggerEffect
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: TriggerEffect -> TriggerEffect -> Ordering
compare :: TriggerEffect -> TriggerEffect -> Ordering
$c< :: TriggerEffect -> TriggerEffect -> Bool
< :: TriggerEffect -> TriggerEffect -> Bool
$c<= :: TriggerEffect -> TriggerEffect -> Bool
<= :: TriggerEffect -> TriggerEffect -> Bool
$c> :: TriggerEffect -> TriggerEffect -> Bool
> :: TriggerEffect -> TriggerEffect -> Bool
$c>= :: TriggerEffect -> TriggerEffect -> Bool
>= :: TriggerEffect -> TriggerEffect -> Bool
$cmax :: TriggerEffect -> TriggerEffect -> TriggerEffect
max :: TriggerEffect -> TriggerEffect -> TriggerEffect
$cmin :: TriggerEffect -> TriggerEffect -> TriggerEffect
min :: TriggerEffect -> TriggerEffect -> TriggerEffect
Ord)
 
data Trigger = Trigger {
            Trigger -> Pre
trgCondition :: Pre                       -- ^ condition to trigger 
            ,Trigger -> TriggerEffect
trgEffects :: TriggerEffect              -- ^ what happen if it was triggered
            ,Trigger -> Bool
trgStatus :: Bool                        -- ^ if it is triggered or not 
            ,Trigger -> Bool
trgCurable :: Bool                       -- ^ if it is curable trigger
            ,Trigger -> Maybe Statement
trgStmt :: Maybe S.Statement             -- ^ Transaction stmt
            } deriving (Int -> Trigger -> ShowS
[Trigger] -> ShowS
Trigger -> String
(Int -> Trigger -> ShowS)
-> (Trigger -> String) -> ([Trigger] -> ShowS) -> Show Trigger
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Trigger -> ShowS
showsPrec :: Int -> Trigger -> ShowS
$cshow :: Trigger -> String
show :: Trigger -> String
$cshowList :: [Trigger] -> ShowS
showList :: [Trigger] -> ShowS
Show, Trigger -> Trigger -> Bool
(Trigger -> Trigger -> Bool)
-> (Trigger -> Trigger -> Bool) -> Eq Trigger
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Trigger -> Trigger -> Bool
== :: Trigger -> Trigger -> Bool
$c/= :: Trigger -> Trigger -> Bool
/= :: Trigger -> Trigger -> Bool
Eq, (forall x. Trigger -> Rep Trigger x)
-> (forall x. Rep Trigger x -> Trigger) -> Generic Trigger
forall x. Rep Trigger x -> Trigger
forall x. Trigger -> Rep Trigger x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Trigger -> Rep Trigger x
from :: forall x. Trigger -> Rep Trigger x
$cto :: forall x. Rep Trigger x -> Trigger
to :: forall x. Rep Trigger x -> Trigger
Generic,Eq Trigger
Eq Trigger =>
(Trigger -> Trigger -> Ordering)
-> (Trigger -> Trigger -> Bool)
-> (Trigger -> Trigger -> Bool)
-> (Trigger -> Trigger -> Bool)
-> (Trigger -> Trigger -> Bool)
-> (Trigger -> Trigger -> Trigger)
-> (Trigger -> Trigger -> Trigger)
-> Ord Trigger
Trigger -> Trigger -> Bool
Trigger -> Trigger -> Ordering
Trigger -> Trigger -> Trigger
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: Trigger -> Trigger -> Ordering
compare :: Trigger -> Trigger -> Ordering
$c< :: Trigger -> Trigger -> Bool
< :: Trigger -> Trigger -> Bool
$c<= :: Trigger -> Trigger -> Bool
<= :: Trigger -> Trigger -> Bool
$c> :: Trigger -> Trigger -> Bool
> :: Trigger -> Trigger -> Bool
$c>= :: Trigger -> Trigger -> Bool
>= :: Trigger -> Trigger -> Bool
$cmax :: Trigger -> Trigger -> Trigger
max :: Trigger -> Trigger -> Trigger
$cmin :: Trigger -> Trigger -> Trigger
min :: Trigger -> Trigger -> Trigger
Ord)

makeLensesFor [("trgStatus","trgStatusLens") 
                ,("trgEffects","trgEffectsLens") 
                ,("trgCondition","trgConditionLens") 
                ,("trgCurable","trgCurableLens")] ''Trigger

$(concat <$> traverse (deriveJSON defaultOptions) [''TriggerEffect, ''Trigger])