{-# LANGUAGE NoImplicitPrelude #-}
{-# LANGUAGE TemplateHaskell #-}

module Data.Aviation.Casr.Logbook.Types.TimeAmount(
  TimeAmount(..)
, HasTimeAmount(..)
, parttimeamount
, zerotimeamount
, addtimeamount
, timeAmountBy10
) where

import Data.Semigroup(Semigroup((<>)))
import Control.Lens(makeClassy, ( # ))
import Data.Eq(Eq)
import Data.Digit(DecDigit, x0, integralDecimal, addDecDigit')
import Data.Int(Int)
import Data.Monoid(Monoid(mempty, mappend))
import Data.Ord(Ord)
import Prelude(Show, Num((+), (*)))

data TimeAmount =
  TimeAmount {
    _hours :: Int
  , _tenthofhour :: DecDigit
  } deriving (Eq, Ord, Show)

makeClassy ''TimeAmount

parttimeamount ::
  DecDigit
  -> TimeAmount
parttimeamount =
  TimeAmount 0

zerotimeamount ::
  TimeAmount
zerotimeamount =
  TimeAmount 0 x0

addtimeamount ::
  TimeAmount
  -> TimeAmount
  -> TimeAmount
TimeAmount f1 p1 `addtimeamount` TimeAmount f2 p2 =
  let (h, q) = p1 `addDecDigit'` p2
  in  TimeAmount (f1 + f2 + integralDecimal # (h :: DecDigit)) q

timeAmountBy10 ::
  TimeAmount
  -> Int
timeAmountBy10 (TimeAmount a b) =
  a * 10 + integralDecimal # b

instance Semigroup TimeAmount where
  (<>) =
    addtimeamount

instance Monoid TimeAmount where
  mempty =
    zerotimeamount
  mappend =
    (<>)