{-# LANGUAGE TemplateHaskell #-}
module Hledger.Read.InputOptions (
  InputOpts(..)
, HasInputOpts(..)
, definputopts
, forecastPeriod
) where
import Control.Applicative ((<|>))
import Data.Time (Day, addDays)
import Hledger.Data.Types
import Hledger.Data.Journal (journalEndDate)
import Hledger.Data.Dates (nulldate, nulldatespan)
import Hledger.Data.Balancing (BalancingOpts(..), HasBalancingOpts(..), defbalancingopts)
import Hledger.Utils (dbg2, makeHledgerClassyLenses)
data InputOpts = InputOpts {
     
     InputOpts -> Maybe StorageFormat
mformat_           :: Maybe StorageFormat  
                                                
    ,InputOpts -> Maybe StorageFormat
mrules_file_       :: Maybe FilePath       
    ,InputOpts -> [StorageFormat]
aliases_           :: [String]             
    ,InputOpts -> Bool
anon_              :: Bool                 
    ,InputOpts -> Bool
new_               :: Bool                 
    ,InputOpts -> Bool
new_save_          :: Bool                 
    ,InputOpts -> StorageFormat
pivot_             :: String               
    ,InputOpts -> Maybe DateSpan
forecast_          :: Maybe DateSpan       
    ,InputOpts -> DateSpan
reportspan_        :: DateSpan             
    ,InputOpts -> Bool
auto_              :: Bool                 
    ,InputOpts -> BalancingOpts
balancingopts_     :: BalancingOpts        
    ,InputOpts -> Bool
strict_            :: Bool                 
    ,InputOpts -> Day
_ioDay             :: Day                  
 } deriving (Int -> InputOpts -> ShowS
[InputOpts] -> ShowS
InputOpts -> StorageFormat
(Int -> InputOpts -> ShowS)
-> (InputOpts -> StorageFormat)
-> ([InputOpts] -> ShowS)
-> Show InputOpts
forall a.
(Int -> a -> ShowS)
-> (a -> StorageFormat) -> ([a] -> ShowS) -> Show a
showList :: [InputOpts] -> ShowS
$cshowList :: [InputOpts] -> ShowS
show :: InputOpts -> StorageFormat
$cshow :: InputOpts -> StorageFormat
showsPrec :: Int -> InputOpts -> ShowS
$cshowsPrec :: Int -> InputOpts -> ShowS
Show)
definputopts :: InputOpts
definputopts :: InputOpts
definputopts = InputOpts :: Maybe StorageFormat
-> Maybe StorageFormat
-> [StorageFormat]
-> Bool
-> Bool
-> Bool
-> StorageFormat
-> Maybe DateSpan
-> DateSpan
-> Bool
-> BalancingOpts
-> Bool
-> Day
-> InputOpts
InputOpts
    { mformat_ :: Maybe StorageFormat
mformat_           = Maybe StorageFormat
forall a. Maybe a
Nothing
    , mrules_file_ :: Maybe StorageFormat
mrules_file_       = Maybe StorageFormat
forall a. Maybe a
Nothing
    , aliases_ :: [StorageFormat]
aliases_           = []
    , anon_ :: Bool
anon_              = Bool
False
    , new_ :: Bool
new_               = Bool
False
    , new_save_ :: Bool
new_save_          = Bool
True
    , pivot_ :: StorageFormat
pivot_             = StorageFormat
""
    , forecast_ :: Maybe DateSpan
forecast_          = Maybe DateSpan
forall a. Maybe a
Nothing
    , reportspan_ :: DateSpan
reportspan_        = DateSpan
nulldatespan
    , auto_ :: Bool
auto_              = Bool
False
    , balancingopts_ :: BalancingOpts
balancingopts_     = BalancingOpts
defbalancingopts
    , strict_ :: Bool
strict_            = Bool
False
    , _ioDay :: Day
_ioDay             = Day
nulldate
    }
forecastPeriod :: InputOpts -> Journal -> Maybe DateSpan
forecastPeriod :: InputOpts -> Journal -> Maybe DateSpan
forecastPeriod InputOpts
iopts Journal
j = do
    DateSpan Maybe Day
requestedStart Maybe Day
requestedEnd <- InputOpts -> Maybe DateSpan
forecast_ InputOpts
iopts
    let forecastStart :: Maybe Day
forecastStart = Maybe Day
requestedStart Maybe Day -> Maybe Day -> Maybe Day
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Maybe Day -> Maybe Day -> Maybe Day
forall a. Ord a => a -> a -> a
max Maybe Day
mjournalend Maybe Day
reportStart Maybe Day -> Maybe Day -> Maybe Day
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Day -> Maybe Day
forall a. a -> Maybe a
Just (InputOpts -> Day
_ioDay InputOpts
iopts)
        forecastEnd :: Maybe Day
forecastEnd   = Maybe Day
requestedEnd Maybe Day -> Maybe Day -> Maybe Day
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Maybe Day
reportEnd Maybe Day -> Maybe Day -> Maybe Day
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> Day -> Maybe Day
forall a. a -> Maybe a
Just (Integer -> Day -> Day
addDays Integer
180 (Day -> Day) -> Day -> Day
forall a b. (a -> b) -> a -> b
$ InputOpts -> Day
_ioDay InputOpts
iopts)
        mjournalend :: Maybe Day
mjournalend   = StorageFormat -> Maybe Day -> Maybe Day
forall a. Show a => StorageFormat -> a -> a
dbg2 StorageFormat
"journalEndDate" (Maybe Day -> Maybe Day) -> Maybe Day -> Maybe Day
forall a b. (a -> b) -> a -> b
$ Bool -> Journal -> Maybe Day
journalEndDate Bool
False Journal
j  
        DateSpan Maybe Day
reportStart Maybe Day
reportEnd = InputOpts -> DateSpan
reportspan_ InputOpts
iopts
    DateSpan -> Maybe DateSpan
forall (m :: * -> *) a. Monad m => a -> m a
return (DateSpan -> Maybe DateSpan)
-> (DateSpan -> DateSpan) -> DateSpan -> Maybe DateSpan
forall b c a. (b -> c) -> (a -> b) -> a -> c
. StorageFormat -> DateSpan -> DateSpan
forall a. Show a => StorageFormat -> a -> a
dbg2 StorageFormat
"forecastspan" (DateSpan -> Maybe DateSpan) -> DateSpan -> Maybe DateSpan
forall a b. (a -> b) -> a -> b
$ Maybe Day -> Maybe Day -> DateSpan
DateSpan Maybe Day
forecastStart Maybe Day
forecastEnd
makeHledgerClassyLenses ''InputOpts
instance HasBalancingOpts InputOpts where
    balancingOpts :: (BalancingOpts -> f BalancingOpts) -> InputOpts -> f InputOpts
balancingOpts = (BalancingOpts -> f BalancingOpts) -> InputOpts -> f InputOpts
forall c. HasInputOpts c => Lens' c BalancingOpts
balancingopts