"""First-block contract and legacy characterization checks."""

from __future__ import annotations

import base64
import sys
import unittest
from pathlib import Path
from unittest.mock import patch


PROJECT_ROOT = Path(__file__).resolve().parents[3]
sys.path.insert(0, str(PROJECT_ROOT))
loaded_platform = sys.modules.get("platform")
if loaded_platform is not None and not hasattr(loaded_platform, "__path__"):
    del sys.modules["platform"]

import apps.wp_invoices as app


CONTEXT = {
    "request_id": "request-1",
    "tenant": {"tenant_id": "tenant-a"},
    "app_id": "wp_invoices",
    "payload": {},
}


class InvoiceCharacterizationChecks(unittest.TestCase):
    def test_manifest_is_valid_and_only_advertises_implemented_v1_actions(self):
        self.assertEqual([], app.APP_MANIFEST.validate())
        self.assertEqual(
            ["confirm_supplier_profile_v1", "health_v1", "result_v1", "smoke_diagnostics_v1", "submit_trusted_v1", "submit_v1"],
            sorted(app.APP_MANIFEST.actions),
        )
        self.assertEqual(
            "health_v1",
            app.APP_MANIFEST.action_for_capability("platform.health"),
        )

    def test_health_uses_standard_envelope_without_ai_or_legacy_pipeline(self):
        with patch.object(app, "_handle_process") as process:
            payload = app.handle_request(CONTEXT, "health_v1")
        self.assertEqual("1.0", payload["contract_version"])
        self.assertEqual("ok", payload["status"])
        self.assertEqual("request-1", payload["request_id"])
        self.assertEqual({
            "healthy": True,
            "ai_checked": False,
            "app_version": "1.1.6",
            "extractor_version": "unified-v2.3-ocr-layout",
        }, payload["data"])
        process.assert_not_called()

    def test_unknown_v1_action_returns_stable_error(self):
        payload, status = app.handle_request(CONTEXT, "missing_v1")
        self.assertEqual(404, status)
        self.assertEqual("action_not_found", payload["error"]["code"])
        self.assertNotIn("traceback", str(payload).lower())

    def test_legacy_health_response_remains_compatible(self):
        payload = app.handle_request(CONTEXT, "test")
        self.assertEqual(
            {"status": "ok", "app": "wp_invoices", "tenant": "tenant-a"},
            payload,
        )

    def test_legacy_process_requires_filename_before_side_effects(self):
        payload, status = app.handle_request(CONTEXT, "process")
        self.assertEqual(400, status)
        self.assertEqual("Missing filename", payload["message"])

    def test_legacy_process_requires_document_bytes_before_side_effects(self):
        context = {**CONTEXT, "payload": {"filename": "invoice.pdf"}}
        payload, status = app.handle_request(context, "process")
        self.assertEqual(400, status)
        self.assertEqual("Missing file_bytes_base64", payload["message"])

    def test_base64_decoder_accepts_plain_and_data_url_inputs(self):
        encoded = base64.b64encode(b"invoice").decode("ascii")
        self.assertEqual(b"invoice", app._decode_file_bytes(encoded))
        self.assertEqual(
            b"invoice",
            app._decode_file_bytes(f"data:application/pdf;base64,{encoded}"),
        )

    def test_base64_decoder_rejects_invalid_input(self):
        with self.assertRaises(ValueError):
            app._decode_file_bytes("not-base64")


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