from __future__ import print_function, division, absolute_import
from fontTools.misc.py23 import *
from fontTools.misc.textTools import safeEval
from . import DefaultTable
import struct
import array

# XXX I've lowered the strictness, to make sure Apple's own Chicago
# XXX gets through. They're looking into it, I hope to raise the standards
# XXX back to normal eventually.

class table_L_T_S_H_(DefaultTable.DefaultTable):

	def decompile(self, data, ttFont):
		version, numGlyphs = struct.unpack(">HH", data[:4])
		data = data[4:]
		assert version == 0, "unknown version: %s" % version
		assert (len(data) % numGlyphs) < 4, "numGlyphs doesn't match data length"
		# ouch: the assertion is not true in Chicago!
		#assert numGlyphs == ttFont['maxp'].numGlyphs
		yPels = array.array("B")
		yPels.fromstring(data)
		self.yPels = {}
		for i in range(numGlyphs):
			self.yPels[ttFont.getGlyphName(i)] = yPels[i]

	def compile(self, ttFont):
		version = 0
		names = list(self.yPels.keys())
		numGlyphs = len(names)
		yPels = [0] * numGlyphs
		# ouch: the assertion is not true in Chicago!
		#assert len(self.yPels) == ttFont['maxp'].numGlyphs == numGlyphs
		for name in names:
			yPels[ttFont.getGlyphID(name)] = self.yPels[name]
		yPels = array.array("B", yPels)
		return struct.pack(">HH", version, numGlyphs) + yPels.tostring()

	def toXML(self, writer, ttFont):
		names = sorted(self.yPels.keys())
		for name in names:
			writer.simpletag("yPel", name=name, value=self.yPels[name])
			writer.newline()

	def fromXML(self, name, attrs, content, ttFont):
		if not hasattr(self, "yPels"):
			self.yPels = {}
		if name != "yPel":
			return # ignore unknown tags
		self.yPels[attrs["name"]] = safeEval(attrs["value"])
