"""Sanity check image sizes and svg viewboxes."""
from PIL import Image
from pathlib import Path
from lxml import etree


def _check_image(base_dir, image_dir):
	assert image_dir.is_dir()
	expected_size = (int(image_dir.name), int(image_dir.name))

	num_bad = 0
	num_good = 0
	for image_file in image_dir.iterdir():
		with Image.open(image_file) as image:
			actual_size = image.size
		if expected_size != actual_size:
			print(f"bad_dim {image_file.relative_to(base_dir)} actual {actual_size} expected {expected_size}")
			num_bad += 1
		else:
			num_good += 1
	return num_bad, num_good

def _check_svg(base_dir, svg_dir):
	expected_viewbox = (0.0, 0.0, 128.0, 128.0)
	num_bad = 0
	num_good = 0
	for svg_file in svg_dir.iterdir():
		if not svg_file.name.startswith("emoji_u"):
			continue
		assert svg_file.is_file()
		with open(svg_file) as f:
			actual_viewbox = etree.parse(f).getroot().attrib["viewBox"]
		actual_viewbox = tuple(float(s) for s in actual_viewbox.split(" "))
		if expected_viewbox != actual_viewbox:
			print(f"bad_dim {svg_file.relative_to(base_dir)} actual {actual_viewbox} expected {expected_viewbox}")
			num_bad += 1
		else:
			num_good += 1
	return num_bad, num_good

def main():
	base_dir = Path(__file__).parent
	image_dir = base_dir / "png"
	svg_dir = base_dir / "svg"

	assert image_dir.is_dir()
	assert svg_dir.is_dir()

	for size_dir in image_dir.iterdir():
		num_bad, num_good = _check_image(base_dir, size_dir)
		print(f"{num_bad}/{num_bad+num_good} issues with {size_dir}")
	num_bad, num_good = _check_svg(base_dir, svg_dir)
	print(f"{num_bad}/{num_bad+num_good} issues with {svg_dir}")

if __name__ == "__main__":
   main()