module Opaleye.PGTypes where

import           Opaleye.Internal.Column (Column(Column))
import qualified Opaleye.Internal.Column as C

import qualified Opaleye.Internal.HaskellDB.PrimQuery as HPQ

import qualified Data.Text as Text
import qualified Data.Time as Time
import qualified Data.UUID as UUID
import qualified System.Locale as SL

literalColumn :: HPQ.Literal -> Column a
literalColumn = Column . HPQ.ConstExpr

pgString :: String -> Column String
pgString = literalColumn . HPQ.StringLit

pgText :: Text.Text -> Column String
pgText = literalColumn . HPQ.StringLit . Text.unpack

pgInt :: Int -> Column Int
pgInt = literalColumn . HPQ.IntegerLit . fromIntegral

pgInteger :: Integer -> Column Integer
pgInteger = literalColumn . HPQ.IntegerLit

pgDouble :: Double -> Column Double
pgDouble = literalColumn . HPQ.DoubleLit

pgBool :: Bool -> Column Bool
pgBool = literalColumn . HPQ.BoolLit

pgUUID :: UUID.UUID -> Column UUID.UUID
pgUUID = C.unsafeCoerce . pgString . UUID.toString

pgDay :: Time.Day -> Column Time.Day
pgDay = Column
        . HPQ.CastExpr "date"
        . HPQ.ConstExpr
        . HPQ.OtherLit
        . format
  where formatString = "'%Y-%m-%d'"
        format = Time.formatTime SL.defaultTimeLocale formatString

pgUTCTime :: Time.UTCTime -> Column Time.UTCTime
pgUTCTime = Column
            . HPQ.CastExpr "timestamp"
            . HPQ.ConstExpr
            . HPQ.OtherLit
            . format
  where formatString = "'%Y-%m-%dT%H:%M:%SZ'"
        format = Time.formatTime SL.defaultTimeLocale formatString