-- | Essential data types used to make Transactions and Postings.
module Penny.Lincoln.Bits (
  -- * Accounts
  O.SubAccount(SubAccount, unSubAccount),
  O.Account(Account, unAccount),

  -- * Amounts
  O.Amount(Amount, qty, commodity, side, spaceBetween),

  -- * Commodities
  O.Commodity(Commodity, unCommodity),

  -- * DateTime
  DT.TimeZoneOffset ( offsetToMins ),
  DT.minsToOffset,
  DT.noOffset,
  DT.Hours ( unHours ),
  DT.intToHours,
  DT.zeroHours,
  DT.Minutes ( unMinutes ),
  DT.intToMinutes,
  DT.zeroMinutes,
  DT.midnight,
  DT.Seconds ( unSeconds ),
  DT.intToSeconds,
  DT.zeroSeconds,
  DT.DateTime ( .. ),
  DT.dateTimeMidnightUTC,
  DT.toUTC,
  DT.toZonedTime,
  DT.fromZonedTime,
  DT.sameInstant,
  DT.showDateTime,

  -- * Debits and Credits
  O.DrCr(Debit, Credit),
  O.opposite,

  -- * Entries
  O.Entry(Entry, drCr, amount),

  -- * Flag
  O.Flag(Flag, unFlag),

  -- * Memos
  O.Memo(Memo, unMemo),

  -- * Number
  O.Number(Number, unNumber),

  -- * Payee
  O.Payee(Payee, unPayee),

  -- * Prices and price points
  Pr.From(From, unFrom), Pr.To(To, unTo),
  Pr.CountPerUnit(CountPerUnit, unCountPerUnit),
  Pr.Price(from, to, countPerUnit),
  Pr.convert, Pr.newPrice,
  PricePoint ( .. ),

  -- * Quantities
  Q.Qty, Q.NumberStr(..), Q.toQty, Q.mantissa, Q.places,
  Q.add, Q.mult, Q.difference, Q.equivalent, Q.newQty,
  Q.Mantissa, Q.Places,
  Q.Difference(Q.LeftBiggerBy, Q.RightBiggerBy, Q.Equal),
  Q.allocate,

  -- * Tags
  O.Tag(Tag, unTag),
  O.Tags(Tags, unTags),

  -- * Metadata
  O.TopLineLine(..),
  O.TopMemoLine(..),
  O.Side(..),
  O.SpaceBetween(..),
  O.Filename(..),
  O.PriceLine(..),
  O.PostingLine(..),
  O.GlobalPosting(..),
  O.FilePosting(..),
  O.GlobalTransaction(..),
  O.FileTransaction(..)
  ) where


import qualified Penny.Lincoln.Bits.Open as O
import qualified Penny.Lincoln.Bits.DateTime as DT
import qualified Penny.Lincoln.Bits.Price as Pr
import qualified Penny.Lincoln.Bits.Qty as Q

data PricePoint = PricePoint { dateTime :: DT.DateTime
                             , price :: Pr.Price
                             , ppSide :: Maybe O.Side
                             , ppSpaceBetween :: Maybe O.SpaceBetween
                             , priceLine :: Maybe O.PriceLine }
                  deriving (Eq, Show)