module Model.Payer.Payment
  ( getTotalPaymentsBefore
  , getTotalPaymentsAfter
  ) where

import Data.Time.Clock (UTCTime)
import Data.Maybe (catMaybes)

import Database.Persist
import Database.Esqueleto
import qualified Database.Esqueleto as E

import Model.Database
import Model.Frequency

getTotalPaymentsBefore :: UTCTime -> Persist [(UserId, Int)]
getTotalPaymentsBefore time =
  getTotalPayments (\p -> p ^. PaymentCreation E.<. val time)

getTotalPaymentsAfter :: UTCTime -> Persist [(UserId, Int)]
getTotalPaymentsAfter time =
  getTotalPayments (\p -> p ^. PaymentCreation E.>=. val time)

getTotalPayments :: (SqlExpr (Entity Payment) -> SqlExpr (Value Bool)) -> Persist [(UserId, Int)]
getTotalPayments paymentWhere = do
  values <- select $
            from $ \payment -> do
              where_ (isNothing (payment ^. PaymentDeletedAt))
              where_ (payment ^. PaymentFrequency E.==. val Punctual)
              where_ (paymentWhere payment)
              groupBy (payment ^. PaymentUserId)
              return (payment ^. PaymentUserId, sum_ (payment ^. PaymentCost))
  return $ catMaybes . map (unMaybe . unValueTuple) $ values

unValueTuple :: (Value a, Value b) -> (a, b)
unValueTuple (Value a, Value b) = (a, b)

unMaybe :: (a, Maybe b) -> Maybe (a, b)
unMaybe (a, Just b) = Just (a, b)
unMaybe _ = Nothing