-- @brief
--  Date and time utilities.
-- 
-- @author
--  [[meta:User:Danny B.]]
local DateTime = {}
----------------------------------------


DateTime = {
	days = {
		{
			name = mw.message.new( "sunday" ):plain(),
			abbr = mw.message.new( "sun" ):plain()
		}, {
			name = mw.message.new( "monday" ):plain(),
			abbr = mw.message.new( "mon" ):plain()
		}, {
			name = mw.message.new( "tuesday" ):plain(),
			abbr = mw.message.new( "tue" ):plain()
		}, {
			name = mw.message.new( "wednesday" ):plain(),
			abbr = mw.message.new( "wed" ):plain()
		}, {
			name = mw.message.new( "thursday" ):plain(),
			abbr = mw.message.new( "thu" ):plain()
		}, {
			name = mw.message.new( "friday" ):plain(),
			abbr = mw.message.new( "fri" ):plain()
		}, {
			name = mw.message.new( "saturday" ):plain(),
			abbr = mw.message.new( "sat" ):plain()
		}
	},
	months = {
		{
			name = mw.message.new( "january" ):plain(),
			abbr = mw.message.new( "jan" ):plain(),
			genitive = mw.message.new( "january-gen" ):plain()
		}, {
			name = mw.message.new( "february" ):plain(),
			abbr = mw.message.new( "feb" ):plain(),
			genitive = mw.message.new( "february-gen" ):plain()
		}, {
			name = mw.message.new( "march" ):plain(),
			abbr = mw.message.new( "mar" ):plain(),
			genitive = mw.message.new( "march-gen" ):plain()
		}, {
			name = mw.message.new( "april" ):plain(),
			abbr = mw.message.new( "apr" ):plain(),
			genitive = mw.message.new( "april-gen" ):plain()
		}, {
			name = mw.message.new( "may_long" ):plain(),
			abbr = mw.message.new( "may" ):plain(),
			genitive = mw.message.new( "may-gen" ):plain()
		}, {
			name = mw.message.new( "june" ):plain(),
			abbr = mw.message.new( "jun" ):plain(),
			genitive = mw.message.new( "june-gen" ):plain()
		}, {
			name = mw.message.new( "july" ):plain(),
			abbr = mw.message.new( "jul" ):plain(),
			genitive = mw.message.new( "july-gen" ):plain()
		}, {
			name = mw.message.new( "august" ):plain(),
			abbr = mw.message.new( "aug" ):plain(),
			genitive = mw.message.new( "august-gen" ):plain()
		}, {
			name = mw.message.new( "september" ):plain(),
			abbr = mw.message.new( "sep" ):plain(),
			genitive = mw.message.new( "september-gen" ):plain()
		}, {
			name = mw.message.new( "october" ):plain(),
			abbr = mw.message.new( "oct" ):plain(),
			genitive = mw.message.new( "october-gen" ):plain()
		}, {
			name = mw.message.new( "november" ):plain(),
			abbr = mw.message.new( "nov" ):plain(),
			genitive = mw.message.new( "november-gen" ):plain()
		}, {
			name = mw.message.new( "december" ):plain(),
			abbr = mw.message.new( "dec" ):plain(),
			genitive = mw.message.new( "december-gen" ):plain()
		}
	}
}


function DateTime.getCurrentTimestamp()
	
	return DateTime.getTimestamp()
	
end


function DateTime.getCurrentUtcOffset()
	
	return DateTime.getUtcOffset()
	
end


function DateTime.getTimestamp( dateTable )
	
	return string.format( "%014d", os.date( "%Y%m%d%H%M%S", os.time( dateTable ) ) )
	
end


function DateTime.getUtcOffset( timeDef )
	
	return 1 + ( DateTime.isEuDst( timeDef ) and 1 or 0 )
	
end


function DateTime.isEuDst( timeDef )
	
	local timestamp
	local year
	
	
	if pcall( os.time, timeDef ) then
		timestamp = tonumber( DateTime.getTimestamp( timeDef ) )
		year = timeDef and timeDef.year or os.date( "%Y" )
	elseif type( timeDef ) == "string" and string.match( timeDef, "%d%d%d%d%d%d%d%d%d%d%d%d%d%d" ) then
		timestamp = tonumber( timeDef )
		year = string.sub( timeDef, 1, 4 )
	else
		error( "Date table or timestamp or nil expected." )
	end
	
	
	return (
		tonumber( year .. "03" .. ( 31 - ( math.floor( 5 * year / 4 ) + 4 ) % 7 ) .. "010000" ) < timestamp
		and
		timestamp <= tonumber( year .. "10" .. ( 31 - ( math.floor( 5 * year / 4 ) + 1 ) % 7 ) .. "010000" )
	)
	
end


function DateTime.parseVerbalDate( verbalDate )
	
	local _
	local pos
	local day
	local monthName
	local month
	local year
	local form = ""
	local lang = mw.language.new( "cs" )
	
	
	_, _, day, pos = mw.ustring.find( verbalDate, "^(%d+)%. ()" )
	_, _, monthName, pos = mw.ustring.find( verbalDate, "^([^%d ]+) ?()", pos )
	_, _, year, pos = mw.ustring.find( verbalDate, "(%d+)$", pos )
	
	if monthName then
		monthName = lang:lc( monthName )
		for index, value in ipairs( DateTime.months ) do
			if ( value.name == monthName or value.genitive == monthName ) then
				month = index
				break
			end
		end
		month = month or 0
	end
	
	form = form .. ( day and "D" or "" ) .. ( month and "M" or "" ) .. ( year and "Y" or "" )
	
	return day, month, year, form
	
end


----------------------------------------
return DateTime