"""PDF content/layout boundaries for the replacement renderer."""

from datetime import UTC, datetime
from io import BytesIO
from types import SimpleNamespace
from typing import Any

from pypdf import PdfReader

from app.services.pdf_service import ReportParameterView, ReportTestGroupView, build_qr_b64
from app.services.report_pdf_renderer import render_diagnostic_pdf


def report_context(status: str = "released", rows: int = 3) -> dict[str, Any]:
    report = SimpleNamespace(
        id="report-123",
        status=SimpleNamespace(value=status),
        version=1,
        notes="Clinical remarks",
        verification_reason="Approved by pathologist",
        verified_at=datetime(2026, 10, 12, tzinfo=UTC),
        verifier=SimpleNamespace(
            name="Dr. Test", license_no="1234", role=SimpleNamespace(value="pathologist")
        ),
    )
    params = [
        ReportParameterView(
            name=f"Investigation {i}",
            value="13.2",
            unit="µg/dL",
            reference_interval="10 – 15",
            flag="H",
            is_abnormal=True,
            notes="Analyzer note & interpretation",
        )
        for i in range(rows)
    ]
    return {
        "report": report,
        "order": SimpleNamespace(order_number="V2026/123", destination_country=None, referred_by_custom=None),
        "patient": SimpleNamespace(
            name="Patient <sample> & name", patient_code="P2026/001", phone="9800000000"
        ),
        "lab": SimpleNamespace(name="Munal Test Lab", address="Kathmandu"),
        "order_date": "2026-10-12",
        "reported_date": "2026-10-12 00:00 UTC",
        "patient_age_gender": "32 Y / Female",
        "specimen_display": "Blood",
        "report_modality": "pathology",
        "imaging_sections": [],
        "test_groups": [ReportTestGroupView("Complete Blood Count", "CBC", params)],
        "watermark_text": "DRAFT — NOT FOR CLINICAL USE" if status == "draft" else None,
        "verifier_signature_b64": None,
        "report_qr_b64": build_qr_b64("https://example.com/client/reports/public-token")
        if status == "released"
        else None,
        "report_qr_url": "https://example.com/client/reports/public-token",
    }


def _reader(context: dict[str, Any]) -> PdfReader:
    pdf = render_diagnostic_pdf(context)
    assert pdf.startswith(b"%PDF-")
    return PdfReader(BytesIO(pdf))


def test_released_pdf_keeps_values_unicode_and_hides_review_flags() -> None:
    reader = _reader(report_context())
    text = "\n".join(page.extract_text() for page in reader.pages)
    for expected in (
        "Patient <sample> & name",
        "13.2",
        "µg/dL",
        "10 – 15",
        "Dr. Test",
        "NMC No.: 1234",
        "OFFICIAL REPORT",
    ):
        assert expected in text
    assert "HIGH" not in text and "DRAFT" not in text
    assert "Scan to view this report online" in text
    assert any(page.get("/Resources").get("/XObject") for page in reader.pages)


def test_multipage_draft_repeats_headers_flags_watermark_and_page_numbers() -> None:
    reader = _reader(report_context("draft", rows=120))
    assert len(reader.pages) >= 3
    for index, page in enumerate(reader.pages, 1):
        text = page.extract_text()
        assert f"Page {index} of {len(reader.pages)}" in text
        assert "DRAFT — NOT FOR CLINICAL USE" in text
    text = "\n".join(page.extract_text() for page in reader.pages)
    assert "HIGH" in text and "Investigation 119" in text
    assert " ".join(text.split()).count("Biological Ref. Interval") >= 2


def test_imaging_pdf_keeps_narratives_amendment_and_signature() -> None:
    context = report_context()
    context["report_modality"] = "imaging"
    context["imaging_sections"] = [
        {
            "test_name": "Chest X-ray",
            "test_code": "CXR",
            "views": ["PA", "Lateral"],
            "findings": "Lungs are clear.\nNo focal opacity.",
            "impression": "Normal chest study.",
        }
    ]
    context["report"].version = 2
    context["report"].verification_reason = "Corrected interpretation"
    context["order"].destination_country = "Japan"
    # Any valid PNG is sufficient to check embedded-signature handling.
    context["verifier_signature_b64"] = build_qr_b64("signature-fixture")
    reader = _reader(context)
    text = "\n".join(page.extract_text() for page in reader.pages)
    for expected in (
        "Chest X-ray",
        "Lungs are clear.",
        "Normal chest study.",
        "AMENDMENT NOTICE",
        "Corrected interpretation",
        "Japan",
    ):
        assert expected in text
    assert "Complete Blood Count" not in text
    assert "Clinical remarks" not in text
    assert "Digitally certified" not in text
    images = [name for page in reader.pages for name in (page.get("/Resources").get("/XObject") or {})]
    assert len(images) >= 2


def test_very_long_parameter_note_and_imaging_narrative_paginate() -> None:
    context = report_context("verified", rows=1)
    context["test_groups"][0].parameters[0].notes = "Very long laboratory observation. " * 600
    reader = _reader(context)
    assert len(reader.pages) > 1
    assert "13.2" in "\n".join(page.extract_text() for page in reader.pages)
    context["report_modality"] = "imaging"
    context["imaging_sections"] = [
        {"test_name": "Imaging", "findings": "Detailed finding. " * 2500, "impression": "Normal"}
    ]
    reader = _reader(context)
    assert len(reader.pages) > 1
    assert "Normal" in reader.pages[-1].extract_text()
