"""fontTools.misc.timeTools.py -- tools for working with OpenType timestamps.
"""

from fontTools.misc.py23 import *
import os
import time
import calendar


epoch_diff = calendar.timegm((1904, 1, 1, 0, 0, 0, 0, 0, 0))

DAYNAMES = ["Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"]
MONTHNAMES = [None, "Jan", "Feb", "Mar", "Apr", "May", "Jun",
			  "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]


def asctime(t=None):
	"""
	Convert a tuple or struct_time representing a time as returned by gmtime()
	or localtime() to a 24-character string of the following form:

	>>> asctime(time.gmtime(0))
	'Thu Jan  1 00:00:00 1970'

	If t is not provided, the current time as returned by localtime() is used.
	Locale information is not used by asctime().

	This is meant to normalise the output of the built-in time.asctime() across
	different platforms and Python versions.
	In Python 3.x, the day of the month is right-justified, whereas on Windows
	Python 2.7 it is padded with zeros.

	See https://github.com/fonttools/fonttools/issues/455
	"""
	if t is None:
		t = time.localtime()
	s = "%s %s %2s %s" % (
		DAYNAMES[t.tm_wday], MONTHNAMES[t.tm_mon], t.tm_mday,
		time.strftime("%H:%M:%S %Y", t))
	return s


def timestampToString(value):
	return asctime(time.gmtime(max(0, value + epoch_diff)))

def timestampFromString(value):
	return calendar.timegm(time.strptime(value)) - epoch_diff

def timestampNow():
	# https://reproducible-builds.org/specs/source-date-epoch/
	source_date_epoch = os.environ.get("SOURCE_DATE_EPOCH")
	if source_date_epoch is not None:
		return int(source_date_epoch) - epoch_diff
	return int(time.time() - epoch_diff)

def timestampSinceEpoch(value):
	return int(value - epoch_diff)


if __name__ == "__main__":
	import sys
	import doctest
	sys.exit(doctest.testmod().failed)
