from __future__ import annotations

import json
import tempfile
import unittest
from pathlib import Path

import fitz

from assignment_tool.engine import Player, generate_assignments, load_profile
from assignment_tool.pdf_generator import generate_print_pdf

ROOT = Path(__file__).resolve().parents[1]


class AssignmentToolTest(unittest.TestCase):
    def setUp(self) -> None:
        self.profile = load_profile(ROOT / "movement_profiles" / "mj-default-v1.json")
        self.players = [
            Player(str(100 + table * 10 + index), f"T{table}{seat}", table, seat)
            for table in range(1, 4)
            for index, seat in enumerate(("E", "W", "S", "N"), start=1)
        ]

    def test_default_movement_and_wrap(self) -> None:
        rows = generate_assignments(self.players, 3, 4, self.profile)
        tables = {
            seat: [a.table for a in rows if a.player_name == f"T1{seat}"]
            for seat in ("E", "W", "S", "N")
        }
        self.assertEqual([1, 1, 1, 1], tables["E"])
        self.assertEqual([1, 3, 2, 1], tables["W"])
        self.assertEqual([1, 3, 2, 1], tables["S"])
        self.assertEqual([1, 2, 3, 1], tables["N"])

    def test_every_round_has_four_seats_per_table(self) -> None:
        rows = generate_assignments(self.players, 3, 12, self.profile)
        for round_no in range(1, 13):
            for table in range(1, 4):
                seats = {a.seat for a in rows if a.round == round_no and a.table == table}
                self.assertEqual({"E", "W", "S", "N"}, seats)

    def test_duplicate_start_position_is_rejected(self) -> None:
        players = self.players[:-1] + [Player("999", "Duplicate", 1, "E")]
        with self.assertRaisesRegex(ValueError, "duplicate"):
            generate_assignments(players, 3, 12, self.profile)

    def test_print_sequence_page_count_and_text(self) -> None:
        rows = generate_assignments(self.players, 3, 12, self.profile)
        template = json.loads((ROOT / "profiles" / "mj-rc5" / "template.json").read_text())
        with tempfile.TemporaryDirectory() as directory:
            output = Path(directory) / "sample.pdf"
            generate_print_pdf(ROOT / "profiles" / "mj-rc5" / "MJ_RC5_2up.pdf", template, rows, 12, output)
            document = fitz.open(output)
            self.assertEqual(len(self.players) * 6, len(document))
            text = document[0].get_text()
            self.assertIn("T1E", text)
            self.assertIn("Table 1 - E", text)
            self.assertEqual(2, text.count("T1E"))


if __name__ == "__main__":
    unittest.main()
