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 AdminMatterIn, AdminOfferIn
from app.main import app


def service_payload(**changes):
    payload = {
        "categoria_id": 1,
        "codigo": "SERVICIO_PRUEBA",
        "nombre": "Servicio de prueba",
        "slug": "servicio-prueba",
    }
    payload.update(changes)
    return payload


def offer_payload(**changes):
    payload = {
        "notaria_id": 1,
        "gesnot_tipo_ot": 2,
        "gesnot_materia": "SERVICIO DE PRUEBA",
        "precio": 10000,
    }
    payload.update(changes)
    return payload


class H2ServiceCoverageContractTests(unittest.TestCase):
    def test_legacy_service_defaults_to_notary(self):
        service = AdminMatterIn(**service_payload())
        self.assertEqual(service.capacidades, ["NOTARIA"])

    def test_service_accepts_multiple_capabilities(self):
        service = AdminMatterIn(**service_payload(
            capacidades=["conservador", "ARCHIVERO", "conservador"]
        ))
        self.assertEqual(service.capacidades, ["CONSERVADOR", "ARCHIVERO"])

    def test_existing_offer_defaults_to_national_coverage(self):
        offer = AdminOfferIn(**offer_payload())
        self.assertEqual(offer.tipo_cobertura, "NACIONAL")
        self.assertEqual(offer.comuna_ids, [])

    def test_custom_coverage_requires_a_territory(self):
        with self.assertRaises(ValidationError):
            AdminOfferIn(**offer_payload(tipo_cobertura="PERSONALIZADA"))
        offer = AdminOfferIn(**offer_payload(
            tipo_cobertura="personalizada", comuna_ids=[1, 1, 2]
        ))
        self.assertEqual(offer.tipo_cobertura, "PERSONALIZADA")
        self.assertEqual(offer.comuna_ids, [1, 2])

    def test_canonical_and_legacy_service_routes_coexist(self):
        paths = {route.path for route in app.routes}
        expected = {
            "/api/v1/servicios",
            "/api/v1/servicios/{slug}",
            "/api/v1/materias",
            "/api/v1/materias/{slug}",
            "/api/v1/panel/admin/services",
            "/api/v1/panel/admin/matters",
            "/api/v1/panel/admin/services/{matter_id}",
            "/api/v1/panel/admin/matters/{matter_id}",
            "/api/v1/panel/offers/entities/{entity_id}/jurisdictions",
        }
        self.assertTrue(expected.issubset(paths), expected - paths)


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