{-# OPTIONS_GHC -fno-warn-orphans #-}
{-# LANGUAGE RecordWildCards #-}

module Data.Validity.Time.Clock where

import Data.Validity

import Data.Time.Clock
import Data.Validity.Time.Calendar ()

-- | Valid according to the 'Rational' it contains.
instance Validity UniversalTime where
    validate = delve "toModifiedJulianDay" . getModJulianDate

-- | Trivially valid
instance Validity DiffTime where
    validate = trivialValidation

instance Validity UTCTime where
    validate UTCTime {..} =
        mconcat
            [ annotate utctDay "utctDay"
            , annotate utctDayTime "utctDayTime"
            , check (utctDayTime >= 0) "The day time is positive."
            , check
                  (utctDayTime < 86401)
                  "The day time is strictly less than 86401."
            ]

instance Validity NominalDiffTime
    -- NominalDiffTime contains a 'Pico' but that constructorr is not exported so we can't do any better than this.
                                                                                                                    where
    validate ndt = annotate ((round :: NominalDiffTime -> Integer) ndt) "round"