module Data.HodaTime.TimeZone
(
   utc
  ,local
  ,timeZoneAt
  ,getUtcOffset
  ,maxOffset
  ,minOffset
)
where

import Data.HodaTime.TimeZone.Internal
import Data.HodaTime.ZonedDateTime.Internal (ZonedDateTime, ZoneLocalResult(..))
import Data.HodaTime.OffsetDateTime.Internal (Offset)

utc :: TimeZone
utc = UTCzone

timeZoneAt :: TZIdentifier -> Maybe TimeZone
timeZoneAt = undefined

local :: TimeZone
local = undefined

{-
atLeniently :: LocalDateTime -> TimeZone -> ZonedDateTime
atLeniently = undefined

atStartOfDay :: LocalDate -> TimeZone -> ZonedDateTime
atStartOfDay = undefined

atStrictly :: LocalDateTime -> TimeZone -> Maybe ZonedDateTime
atStrictly ldt UTCzone = Just $ atLeniently ldt UTCzone
atStrictly _ldt _tz = undefined

-- | Return all 'ZonedDateTime' entries for a specific 'LocalDateTime' in a 'TimeZone'. Normally this would be one, but in the case that a time occurs twice in a zone (i.e. due to daylight savings time change)
-- | both would be returned.  Also, if the time does not occur at all, 'Nothing' will be returned.  This method allows the user to choose exactly what to do in the case of ambigiuty.
atAll :: LocalDateTime -> TimeZone -> Maybe ZoneLocalResult
atAll ldt UTCzone = Just . ZLSingle $ atLeniently ldt UTCzone
atAll _ldt _tz = undefined

-- | Takes two functions to determine how to resolve a 'LocalDateTime' to a 'ZonedDateTime' in the case of ambiguity or skipped times.  The first function is for the ambigous case and is past the first
-- | matching 'ZonedDateTime', followed by the second match. The second function is for the case that the 'LocalDateTime' doesn't exist in the 'TimeZone' (e.g. in a spring-forward situation, there will
-- | be a missing hour), the first 'ZonedDateTime' will be the the last time before the gap and the second will be the first time after the gap.
resolve :: LocalDateTime -> TimeZone -> (ZonedDateTime -> ZonedDateTime -> Maybe ZonedDateTime) -> (ZonedDateTime -> ZonedDateTime -> Maybe ZonedDateTime) -> Maybe ZonedDateTime
resolve ldt UTCzone _ _ = Just $ atLeniently ldt UTCzone
resolve _ldt _tz _am _sk = undefined

-- | Return a special 'ZonedDateTime' for the given 'Offset'.  The identifier will be "UTC" in the case of a zero 'Offset' and "UTC(+/-)Offset" otherwise.
forOffset :: LocalDateTime -> Offset -> TimeZone
forOffset = undefined
-}

getUtcOffset :: TimeZone -> Int
getUtcOffset UTCzone = 0
getUtcOffset _tz = undefined

maxOffset :: TimeZone -> Int
maxOffset UTCzone = 0
maxOffset _tz = undefined

minOffset :: TimeZone -> Int
minOffset UTCzone = 0
minOffset _tz = undefined