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

module Deal.DealDate (DealDates,getClosingDate,getFirstPayDate,getLastPayDate) 
  where

import qualified Data.Map as Map
import Deal.DealBase
import Types
import Lib

class DealDates a where 
  getClosingDate :: a -> Either String Date
  getFirstPayDate :: a -> Date
  getLastPayDate :: a -> Either String Date

instance DealDates DateDesp where 
  getClosingDate :: DateDesp -> Either String Date
getClosingDate (GenericDates Map DateType DatePattern
m) = case DateType -> Map DateType DatePattern -> Maybe DatePattern
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup DateType
ClosingDate Map DateType DatePattern
m of 
                                      Just (SingletonDate Date
x) -> Date -> Either String Date
forall a b. b -> Either a b
Right Date
x
                                      Maybe DatePattern
Nothing -> String -> Either String Date
forall a b. a -> Either a b
Left (String -> Either String Date) -> String -> Either String Date
forall a b. (a -> b) -> a -> b
$ String
"ClosingDate not found in GenericDates"String -> String -> String
forall a. [a] -> [a] -> [a]
++Map DateType DatePattern -> String
forall a. Show a => a -> String
show Map DateType DatePattern
m
  
  getClosingDate (PreClosingDates Date
_ Date
x Maybe Date
_ Date
_ (Date, DatePattern)
_ (Date, DatePattern)
_) = Date -> Either String Date
forall a b. b -> Either a b
Right Date
x

  getClosingDate (CurrentDates (Date
_,Date
cd) Maybe Date
_ Date
_ (Date, DatePattern)
_ (Date, DatePattern)
_ ) = Date -> Either String Date
forall a b. b -> Either a b
Right Date
cd

  getLastPayDate :: DateDesp -> Either String Date
getLastPayDate (GenericDates Map DateType DatePattern
m) = case DateType -> Map DateType DatePattern -> Maybe DatePattern
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup DateType
LastPayDate Map DateType DatePattern
m of 
                                      Just (SingletonDate Date
x) -> Date -> Either String Date
forall a b. b -> Either a b
Right Date
x
                                      Maybe DatePattern
Nothing -> String -> Either String Date
forall a b. a -> Either a b
Left (String -> Either String Date) -> String -> Either String Date
forall a b. (a -> b) -> a -> b
$ String
"LastPayDate not found in GenericDates"String -> String -> String
forall a. [a] -> [a] -> [a]
++ Map DateType DatePattern -> String
forall a. Show a => a -> String
show Map DateType DatePattern
m

  getLastPayDate (CurrentDates (Date
_,Date
cd) Maybe Date
_ Date
_ (Date, DatePattern)
_ (Date, DatePattern)
_ ) = Date -> Either String Date
forall a b. b -> Either a b
Right Date
cd
  
  getLastPayDate (PreClosingDates {}) = String -> Either String Date
forall a b. a -> Either a b
Left String
"Error : try to get last pay date from PreClosingDates"

  getFirstPayDate :: DateDesp -> Date
getFirstPayDate (PreClosingDates Date
_ Date
_ Maybe Date
_ Date
_ (Date, DatePattern)
_ (Date
fp,DatePattern
_)) = Date
fp
  
  getFirstPayDate (CurrentDates (Date, Date)
_ Maybe Date
_ Date
_ (Date, DatePattern)
_ (Date
cpay,DatePattern
_)) = Date
cpay    

  getFirstPayDate (GenericDates Map DateType DatePattern
m) = case DateType -> Map DateType DatePattern -> Maybe DatePattern
forall k a. Ord k => k -> Map k a -> Maybe a
Map.lookup DateType
FirstPayDate Map DateType DatePattern
m of
                                        Just (SingletonDate Date
x) -> Date
x
                                        Maybe DatePattern
Nothing -> String -> Date
forall a. HasCallStack => String -> a
error String
"FirstPayDate not found in GenericDates"