"""Verify fixture structure and expected values, not a model's behavior."""

import json
import unittest
from decimal import Decimal
from pathlib import Path

from pypdf import PdfReader

from check_pdf import inspect_pdf


ROOT = Path(__file__).resolve().parent


class PdfFixtureTests(unittest.TestCase):
    def setUp(self):
        self.expected = json.loads((ROOT / "expected.json").read_text(encoding="utf-8"))

    def test_both_files_have_three_pages(self):
        for filename in ("text-layer.pdf", "image-only.pdf"):
            with self.subTest(filename=filename):
                report = inspect_pdf(ROOT / filename)
                self.assertEqual(report["physical_pages"], self.expected["physical_pages"])
                self.assertEqual([page["physical_page"] for page in report["pages"]], [1, 2, 3])

    def test_each_text_page_has_its_marker_and_printed_label(self):
        pages = PdfReader(ROOT / "text-layer.pdf").pages
        for index, page in enumerate(pages):
            with self.subTest(physical_page=index + 1):
                text = page.extract_text() or ""
                self.assertIn(self.expected["markers"][index], text)
                self.assertIn(self.expected["printed_pages"][index], text)

    def test_table_and_final_page_note_are_present(self):
        pages = PdfReader(ROOT / "text-layer.pdf").pages
        table_text = pages[1].extract_text() or ""
        for row in self.expected["table"]["rows"]:
            self.assertIn(row["record_id"], table_text)
            self.assertIn(row["amount"], table_text)
        self.assertIn(self.expected["currency"], table_text)
        self.assertIn(self.expected["table"]["total"], table_text)
        self.assertIn(self.expected["footnote"], pages[2].extract_text() or "")

    def test_image_only_file_has_images_but_no_extracted_page_text(self):
        pages = PdfReader(ROOT / "image-only.pdf").pages
        for index, page in enumerate(pages):
            with self.subTest(physical_page=index + 1):
                self.assertEqual((page.extract_text() or "").strip(), "")
                self.assertEqual(len(page.images), 1)

    def test_expected_total_uses_decimal_arithmetic(self):
        total = sum((Decimal(row["amount"]) for row in self.expected["table"]["rows"]), Decimal("0"))
        self.assertEqual(total, Decimal(self.expected["table"]["total"]))


if __name__ == "__main__":
    unittest.main()
