-- | Time utils useful for writing buildbots.
module BuildBox.Time
	( module Data.Time
	, readLocalTimeOfDayAsUTC
	, getStampyTime
	, getMidnightTodayLocal
	, getMidnightTodayUTC
	, getMidnightTomorrowLocal
	, getMidnightTomorrowUTC)
where
import Data.Time
import System.Locale


-- | Read a time of day string like @17:34:05@ in the local time zone
--   and convert that to a UTC time of day. Good for parsing command line args to buildbots.
readLocalTimeOfDayAsUTC :: String -> IO TimeOfDay
readLocalTimeOfDayAsUTC str
 = do	
	-- Get the current timeZone.
	curTime	<- getZonedTime

	-- Convert the time of day to what it would be as UTC.
	let (_, timeOfDayUTC)
		=  localToUTCTimeOfDay 
			(zonedTimeZone curTime)
			(read str) 

	return timeOfDayUTC


-- | Get a local time stamp with format YYYYMMDD_HHMMSS. Good for naming files with.
getStampyTime :: IO String
getStampyTime
 = do	time	<- getZonedTime
	return	$  formatTime defaultTimeLocale "%0Y%0m%0d_%0k%0M%0S" time


-- | Get the local midnight we've just had as a `LocalTime`.
getMidnightTodayLocal :: IO LocalTime
getMidnightTodayLocal
 = do	curTime	<- getZonedTime
	return	$ LocalTime
		{ localDay		= localDay $ zonedTimeToLocalTime curTime
		, localTimeOfDay	= midnight }


-- | Get the local midnight that we've just had, as a `UTCTime`.
getMidnightTodayUTC :: IO UTCTime 
getMidnightTodayUTC
 = do	curTime	<- getZonedTime
	return	$ zonedTimeToUTC
		$ ZonedTime
			(LocalTime	
				{ localDay		= localDay $ zonedTimeToLocalTime curTime
				, localTimeOfDay	= midnight })
			(zonedTimeZone curTime)


-- | Get the local midnight we're about to have as a `LocalTime`.
getMidnightTomorrowLocal :: IO LocalTime
getMidnightTomorrowLocal
 = do	curTime	<- getZonedTime
	return	$ LocalTime
		{ localDay		= addDays 1 (localDay (zonedTimeToLocalTime curTime)) 
		, localTimeOfDay	= midnight }

-- | Get the local midnight we're about to have as a `UTCTime`.
getMidnightTomorrowUTC 	 :: IO UTCTime
getMidnightTomorrowUTC
 = do	curTime	<- getZonedTime
	return	$ zonedTimeToUTC
		$ ZonedTime
		  	(LocalTime
				{ localDay		= addDays 1 (localDay (zonedTimeToLocalTime curTime)) 
				, localTimeOfDay	= midnight })
			(zonedTimeZone curTime)