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

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

import Control.Lens(makeClassy, ( # ))
import Data.Eq(Eq)
import Data.Digit(Digit, x0, digit, (/+/))
import Data.Int(Int)
import Data.Monoid(Monoid(mempty, mappend))
import Data.Ord(Ord)
import Prelude(Show, Num((+), (*)))

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

makeClassy ''TimeAmount

parttimeamount ::
  Digit
  -> 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 /+/ p2
  in  TimeAmount (f1 + f2 + digit # h) q 

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

instance Monoid TimeAmount where
  mempty =
    zerotimeamount
  mappend =
    addtimeamount