module Data.HodaTime.TimeZone.Internal
(
   TZIdentifier
  ,TransitionInfo(..)
  ,Transitions
  ,mkTransitions
  ,addTransitionInfo
  ,activeTransitionInfoFor
  ,nextTransitionInfo
  ,TimeZone(..)
)
where

import Data.Maybe (fromMaybe)
import Data.HodaTime.Instant.Internal (Instant)
import Data.Map.Strict (Map)
import qualified Data.Map.Strict as Map

newtype TZIdentifier = Zone String
  deriving (Eq, Show)

data TransitionInfo = TransitionInfo {
   ttGmtOffset :: Int
  ,ttIsDst :: Bool
  ,ttAbbreviation :: String
  ,ttIsStd :: Bool
  ,ttIsGmt :: Bool } deriving (Eq, Show)

type Transitions = Map Instant TransitionInfo

mkTransitions :: Transitions
mkTransitions = Map.empty

addTransitionInfo :: Instant -> TransitionInfo -> Transitions -> Transitions
addTransitionInfo = Map.insert

activeTransitionInfoFor :: Instant -> Transitions -> (Instant, TransitionInfo)
activeTransitionInfoFor t ts = fromMaybe (Map.findMin ts) $ Map.lookupLE t ts

nextTransitionInfo :: Instant -> Transitions -> (Instant, TransitionInfo)
nextTransitionInfo t ts = fromMaybe (Map.findMax ts) $ Map.lookupGT t ts

data TimeZone =
    UTCzone
  | TimeZone {
     tzZone :: TZIdentifier
    ,tzTransitions :: Transitions }
      deriving (Eq, Show)