#!/usr/bin/env python3
"""
Jurislocator™ PSTQ MIFI PDF prefill helper
Input: JSON exported by jurislocator_pstq_mifi_exact_calculator_v4.html
Output: filled MIFI self-evaluation PDF.

The source-of-truth values written into dropdown fields are the exact French display
labels from the MIFI PDF. No English translation is written into the MIFI form.
"""
from pathlib import Path
from pypdf import PdfReader, PdfWriter
import json, sys

HERE = Path(__file__).resolve().parent
# Legacy fallback when callers do not pass an explicit blank PDF path.
FORM_FILES = {
    "ME-0104-2608": HERE / "FO_autoevaluation_sans_conjoint_ME-0104-2606.pdf",
    "ME-0120-2608": HERE / "FO_autoevaluation_avec_conjoint_ME-0120-2606.pdf",
}

# MIFI AcroForm LD keys (LD20 is not used on the forms).
ALLOWED_LD_FIELDS = frozenset(
    f"LD{n}" for n in list(range(1, 20)) + list(range(21, 29))
)


def fill(payload_path, output_path=None, blank_path=None, spouse_mode=None):
    payload_path = Path(payload_path)
    data = json.loads(payload_path.read_text(encoding="utf-8"))
    form_code = data["form"]
    if blank_path:
        src = Path(blank_path)
    elif form_code in FORM_FILES:
        src = FORM_FILES[form_code]
    else:
        raise KeyError(f"Unknown form code (no blank path provided): {form_code}")
    if not src.exists():
        raise FileNotFoundError(f"Missing source form: {src}")
    out = Path(output_path) if output_path else payload_path.with_name(payload_path.stem + "_FILLED.pdf")

    reader = PdfReader(str(src))
    writer = PdfWriter()
    writer.clone_document_from_reader(reader)
    writer.set_need_appearances_writer(True)

    values = {}
    part1 = 0
    part2 = 0

    for field, item in data.get("fields", {}).items():
        if field not in ALLOWED_LD_FIELDS:
            continue

        suffix = field[2:]
        if not suffix.isdigit():
            continue

        display = item.get("display", "")
        try:
            points = int(item.get("points", 0) or 0)
        except (TypeError, ValueError):
            points = 0

        # Exact MIFI French display label, not translated.
        values[field] = display
        txt = "txt" + suffix
        values[txt] = str(points)
        n = int(suffix)
        if n <= 19:
            part1 += points
        elif 21 <= n <= 28:
            part2 += points

    # Non-scoring routing field LD13 has no txt13 field.
    values.pop("txt13", None)

    with_spouse = spouse_mode == "with" or (
        spouse_mode is None and (form_code == "ME-0120-2608" or "avec_conjoint" in src.name)
    )
    if with_spouse:
        values["Pointage total 20"] = str(part1)
        values["Pointage total 29"] = str(part2)
        values["Pointage total 30"] = str(part1 + part2)
    else:
        values["Pointage total 20"] = str(part1)

    for page in writer.pages:
        writer.update_page_form_field_values(page, values, auto_regenerate=True)

    with out.open("wb") as f:
        writer.write(f)
    return out

if __name__ == "__main__":
    if len(sys.argv) < 2:
        print("Usage: python prefill_pstq_mifi_pdf.py <payload.json> [output.pdf] [blank.pdf] [spouse_mode]")
        raise SystemExit(2)
    result = fill(
        sys.argv[1],
        sys.argv[2] if len(sys.argv) > 2 else None,
        sys.argv[3] if len(sys.argv) > 3 else None,
        sys.argv[4] if len(sys.argv) > 4 else None,
    )
    print(result)
