import os
import unittest


os.environ.setdefault("DATABASE_URL", "mysql+pymysql://test:test@127.0.0.1/documenta")
os.environ.setdefault("REDIS_URL", "redis://127.0.0.1:6379/0")
os.environ.setdefault("APP_ENCRYPTION_KEY", "test-encryption-key")
os.environ.setdefault("PII_HMAC_KEY", "test-pii-key")
os.environ.setdefault("ACCESS_TOKEN_HMAC_KEY", "test-access-key")

from pydantic import ValidationError

from app.api.panel_routes import AdminOfferIn
from app.api.routes import resolve_post_payment_route
from app.api.schemas import RequestCreate
from app.main import app


class H4UniversalRequestContractTests(unittest.TestCase):
    def test_canonical_and_legacy_routes_coexist(self):
        paths={route.path for route in app.routes}
        expected={
            "/api/v1/solicitudes",
            "/api/v1/solicitudes/{folio}",
            "/api/v1/solicitudes/{folio}/estado",
            "/api/v1/solicitudes/{folio}/archivos",
            "/api/v1/ventas",
            "/api/v1/ventas/{folio}",
            "/api/v1/panel/requests",
            "/api/v1/panel/requests/{request_ref}",
        }
        self.assertTrue(expected.issubset(paths),expected-paths)

    def test_request_uses_offer_and_preserves_customer_contract(self):
        request=RequestCreate(
            oferta_id=10,
            cliente={"nombres":"María José","apellidos":"Pérez Soto",
                     "email":"maria@example.cl","rut":"76.828.790-2"},
            captcha_token="test-token",
        )
        self.assertEqual(request.oferta_id,10)
        self.assertEqual(request.cliente.rut,"76.828.790-2")

    def test_direct_delivery_supports_all_entity_capabilities(self):
        for capability in ("NOTARIA","CONSERVADOR","ARCHIVERO"):
            self.assertEqual(
                resolve_post_payment_route({capability},{capability},set()),
                "ENTITY_INBOX",
            )

    def test_gesnot_is_only_selected_for_notarial_offers(self):
        self.assertEqual(
            resolve_post_payment_route({"NOTARIA"},{"NOTARIA"},{"GESNOT"}),
            "GESNOT",
        )
        self.assertEqual(
            resolve_post_payment_route({"CONSERVADOR"},{"CONSERVADOR"},{"GESNOT"}),
            "ENTITY_INBOX",
        )

    def test_incompatible_offer_is_rejected(self):
        with self.assertRaises(RuntimeError):
            resolve_post_payment_route({"CONSERVADOR"},{"ARCHIVERO"},set())

    def test_gesnot_connector_requires_its_matter(self):
        with self.assertRaises(ValidationError):
            AdminOfferIn(notaria_id=1,precio=10000,conector_post_pago="GESNOT")
        direct=AdminOfferIn(notaria_id=1,precio=10000)
        self.assertEqual(direct.conector_post_pago,"NINGUNO")


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