"""Regression tests for the TDC preprocessing/control/OMR wrapper."""

from __future__ import annotations

import argparse
import sys
from pathlib import Path


ROOT = Path(__file__).resolve().parent
BUNDLE = ROOT.parent if ROOT.name == "wrapper" else ROOT / "output/omr/TDC_Form_Family_v01_RC2_OMR"
WRAPPER_DIR = BUNDLE / "wrapper"
sys.path.insert(0, str(WRAPPER_DIR))
from tdc_omr_wrapper import process  # noqa: E402


def parse_args() -> argparse.Namespace:
    parser = argparse.ArgumentParser()
    parser.add_argument("--omrchecker", type=Path, required=True)
    return parser.parse_args()


def assert_full_result(result: dict, rotation: int | None = None) -> None:
    assert result["status"] == "accepted", result
    assert result["driver_id"] == "159", result
    assert all(result["answers"][f"q{i}"] == "ABCDE"[(i - 1) % 5] for i in range(1, 51)), result
    if rotation is not None:
        assert result["rotation_degrees_clockwise"] == rotation, result


def main() -> int:
    args = parse_args()
    form_id = "TDC50-ABCDE-v01-RC2"
    tests = BUNDLE / "wrapper_tests"
    positive = [
        ("base.png", 0),
        ("rotated_90_clockwise.png", 270),
        ("rotated_180.png", 180),
        ("strong_diagonal_shadow.png", 0),
    ]
    for filename, rotation in positive:
        result = process(tests / filename, form_id, BUNDLE, args.omrchecker.resolve())
        assert_full_result(result, rotation)
        print(f"PASS: {filename} accepted with exact ID and 50 answers")

    damaged = process(tests / "damaged_control.png", form_id, BUNDLE, args.omrchecker.resolve())
    assert damaged["status"] == "rescan" and "control pattern mismatch" in damaged["flags"], damaged
    print("PASS: damaged control pattern rejected for rescan")

    multiple = process(tests / "multiple_mark_q1.pdf", form_id, BUNDLE, args.omrchecker.resolve())
    assert multiple["status"] == "review", multiple
    assert any(issue["field"] == "q1" and issue["reason"] == "multiple marks" for issue in multiple["confidence_issues"]), multiple
    print("PASS: multiple mark returned for review")
    return 0


if __name__ == "__main__":
    raise SystemExit(main())
