"""Trust-gate checks for invoice result v2."""

from __future__ import annotations

import sys
import unittest
from pathlib import Path

PROJECT_ROOT = Path(__file__).resolve().parents[3]
sys.path.insert(0, str(PROJECT_ROOT))

from apps.wp_invoices.services.quality_gate import evaluate_invoice_quality, normalize_invoice_type
from apps.wp_invoices.services.canonical_result import build_canonical_result_v2


class QualityGateChecks(unittest.TestCase):
    def test_v2_result_exposes_type_and_review_status(self):
        result = build_canonical_result_v2(
            extracted={"invoice_type": {"verbatim": "POS", "confidence": 0.9}},
            invoice_id="inv-1", filename="receipt.jpg", content_type="image/jpeg",
            size_bytes=10, artifact_id="artifact-1", engine="mini",
        )
        self.assertEqual("2.0", result["result_contract_version"])
        self.assertEqual("pos", result["invoice_type"])
        self.assertEqual("needs_review", result["review_status"])

    def test_complete_invoice_is_accepted_and_can_teach_profile(self):
        quality = evaluate_invoice_quality(
            items=[{"quantity": 2, "unit_price": 50, "tax": 0, "line_total": 100}],
            subtotal=100, tax=10, total=110,
            supplier_name="Supplier", invoice_date="2026-07-24",
        )
        self.assertEqual("accepted", quality["review_status"])
        self.assertEqual(1.0, quality["item_coverage"])
        self.assertTrue(quality["can_teach_supplier_profile"])

    def test_aldi_regression_is_needs_review_not_success(self):
        quality = evaluate_invoice_quality(
            items=[{"quantity": 1, "unit_price": 3.49, "tax": None, "line_total": 3.49}],
            subtotal=89.46, tax=None, total=89.90,
            supplier_name="ALDI STORES", invoice_date="06 APR 2024",
        )
        self.assertEqual("needs_review", quality["review_status"])
        self.assertAlmostEqual(0.039, quality["item_coverage"], places=3)
        self.assertFalse(quality["can_teach_supplier_profile"])
        self.assertIn("line_item_coverage_low", [issue["code"] for issue in quality["issues"]])

    def test_line_arithmetic_error_is_explicit(self):
        quality = evaluate_invoice_quality(
            items=[{"quantity": 3, "unit_price": 10, "tax": 0, "line_total": 25}],
            subtotal=25, tax=0, total=25,
            supplier_name="Supplier", invoice_date="2026-07-24",
        )
        line_check = next(v for v in quality["validations"] if v["code"] == "quantity_times_unit_matches_line_total")
        self.assertEqual("failed", line_check["status"])
        self.assertEqual(30.0, line_check["calculated"])
        self.assertEqual("needs_review", quality["review_status"])

    def test_type_normalization_preserves_pos_corporate_and_unknown(self):
        self.assertEqual("pos", normalize_invoice_type({"verbatim": "POS"}))
        self.assertEqual("corporate", normalize_invoice_type({"value": "Tax Invoice"}))
        self.assertEqual("unknown", normalize_invoice_type(None))

    def test_tax_inclusive_pos_reconciles_adjustment_without_adding_gst(self):
        quality = evaluate_invoice_quality(
            items=[{"quantity": 1, "unit_price": 89.46, "tax": None, "line_total": 89.46}],
            subtotal=89.46, tax=1.98, total=89.90,
            adjustments=[{"type": "payment_surcharge", "amount": 0.44, "participates_in_total": True}],
            tax_inclusive=True, supplier_name="ALDI STORES", invoice_date="06 APR 2024",
            reconciliation={"subtotal_reconciled": "passed", "adjustments_reconciled": "passed",
                            "tax_reconciled": "passed", "source_evidence_valid": "passed", "issues": []},
        )
        checks = {value["code"]: value for value in quality["validations"]}
        self.assertEqual("not_applicable", checks["subtotal_plus_tax_matches_total"]["status"])
        self.assertEqual("passed", checks["subtotal_plus_adjustments_matches_total"]["status"])
        self.assertEqual("accepted", quality["review_status"])

    def test_package_size_does_not_participate_in_line_arithmetic(self):
        quality = evaluate_invoice_quality(
            items=[{"quantity": 1, "package_size": {"value": 4, "unit": "L"},
                    "unit_price": 10.69, "line_total": 10.69}],
            subtotal=10.69, tax=0.97, total=10.69, adjustments=[], tax_inclusive=True,
            supplier_name="Supplier", invoice_date="2026-07-26",
        )
        line = next(value for value in quality["validations"] if value["code"] == "quantity_times_unit_matches_line_total")
        self.assertEqual("passed", line["status"])


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