# Copyright (c) 2015, JINGROW and Contributors
# License: MIT. See LICENSE
import os
import re
import unittest
from typing import TYPE_CHECKING

import jingrow
from jingrow.tests.utils import JingrowTestCase

if TYPE_CHECKING:
	from jingrow.printing.pagetype.print_format.print_format import PrintFormat

test_records = jingrow.get_test_records("Print Format")


class TestPrintFormat(JingrowTestCase):
	def test_print_user(self, style=None):
		print_html = jingrow.get_print("User", "Administrator", style=style)
		self.assertTrue("<label>First Name: </label>" in print_html)
		self.assertTrue(re.findall(r'<div class="col-xs-[^"]*">[\s]*administrator[\s]*</div>', print_html))
		return print_html

	def test_print_user_standard(self):
		print_html = self.test_print_user("Standard")
		self.assertTrue(re.findall(r"\.print-format {[\s]*font-size: 9pt;", print_html))
		self.assertFalse(re.findall(r"th {[\s]*background-color: #eee;[\s]*}", print_html))
		self.assertFalse("font-family: serif;" in print_html)

	def test_print_user_modern(self):
		print_html = self.test_print_user("Modern")
		self.assertTrue("/* modern format: for-test */" in print_html)

	def test_print_user_classic(self):
		print_html = self.test_print_user("Classic")
		self.assertTrue("/* classic format: for-test */" in print_html)

	@unittest.skipUnless(
		os.access(jingrow.get_app_path("jingrow"), os.W_OK), "Only run if jingrow app paths is writable"
	)
	def test_export_pg(self):
		pg: "PrintFormat" = jingrow.get_pg("Print Format", test_records[0]["name"])

		# this is only to make export_pg happy
		pg.standard = "Yes"
		_before = jingrow.conf.developer_mode
		jingrow.conf.developer_mode = True
		export_path = pg.export_pg()
		jingrow.conf.developer_mode = _before

		exported_pg_path = f"{export_path}.json"
		pg.reload()
		pg_dict = pg.as_dict(no_nulls=True, convert_dates_to_str=True)

		self.assertTrue(os.path.exists(exported_pg_path))

		with open(exported_pg_path) as f:
			exported_pg = jingrow.parse_json(f.read())

		for key, value in exported_pg.items():
			if key in pg_dict:
				with self.subTest(key=key):
					self.assertEqual(value, pg_dict[key])

		self.addCleanup(os.remove, exported_pg_path)
