{-# LANGUAGE
    OverloadedStrings
  , UnicodeSyntax
  #-}
-- |Internal functions for "Data.Time.Asctime".
module Data.Time.Asctime.Internal
    ( asctime
    , toAsciiBuilder
    )
    where
import Data.Ascii (AsciiBuilder)
import qualified Data.Ascii as A
import Data.Attoparsec.Char8
import Data.Monoid.Unicode
import Data.Time
import Data.Time.Calendar.WeekDate
import Data.Time.HTTP.Common

-- |Parse an ANSI C's @asctime()@ string.
asctime  Parser LocalTime
asctime = do weekDay  shortWeekDayNameP
             _        char ' '
             month    shortMonthNameP
             _        char ' '
             day      read2'
             _        char ' '
             hour     read2
             _        char ':'
             minute   read2
             _        char ':'
             second   read2
             _        char ' '
             year     read4

             gregDay  assertGregorianDateIsGood year month day
             _        assertWeekDayIsGood weekDay gregDay
             tod      assertTimeOfDayIsGood hour minute second

             return (LocalTime gregDay tod)

-- |Convert a 'LocalTime' to ANSI C's @asctime()@ string.
toAsciiBuilder  LocalTime  AsciiBuilder
toAsciiBuilder localTime
    = let (year, month, day) = toGregorian (localDay localTime)
          (_, _, week)       = toWeekDate  (localDay localTime)
          timeOfDay          = localTimeOfDay localTime
      in
        shortWeekDayName week
         A.toAsciiBuilder " "
         shortMonthName month
         A.toAsciiBuilder " "
         show2' day
         A.toAsciiBuilder " "
         show2 (todHour timeOfDay)
         A.toAsciiBuilder ":"
         show2 (todMin timeOfDay)
         A.toAsciiBuilder ":"
         show2 (floor (todSec timeOfDay)  Int)
         A.toAsciiBuilder " "
         show4 year