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 AdminEntityIn
from app.main import app


def entity_payload(**changes):
    payload = {
        "rut": "76.828.790-2",
        "razon_social": "Entidad de prueba SpA",
        "nombre_fantasia": "Entidad de prueba",
        "nombre_notario": "Titular de prueba",
        "comuna_id": 1,
        "direccion": "Huérfanos 1160",
        "email_operaciones": "operaciones@example.cl",
        "email_notificaciones": "notificaciones@example.cl",
    }
    payload.update(changes)
    return payload


class EntityContractTests(unittest.TestCase):
    def test_legacy_create_defaults_to_notary_capability(self):
        entity = AdminEntityIn(**entity_payload())
        self.assertEqual(entity.capacidades, ["NOTARIA"])

    def test_entity_can_combine_capabilities_without_duplicates(self):
        entity = AdminEntityIn(
            **entity_payload(capacidades=["notaria", "CONSERVADOR", "notaria"])
        )
        self.assertEqual(entity.capacidades, ["NOTARIA", "CONSERVADOR"])

    def test_entity_requires_at_least_one_valid_capability(self):
        with self.assertRaises(ValidationError):
            AdminEntityIn(**entity_payload(capacidades=[]))
        with self.assertRaises(ValidationError):
            AdminEntityIn(**entity_payload(capacidades=["OTRO"]))

    def test_canonical_and_legacy_routes_coexist(self):
        paths = {route.path for route in app.routes}
        expected = {
            "/api/v1/entidades",
            "/api/v1/notarias",
            "/api/v1/embed/entidades/{entidad_uuid}/documentos",
            "/api/v1/embed/notarias/{notaria_uuid}/documentos",
            "/api/v1/panel/admin/entities",
            "/api/v1/panel/admin/notaries",
            "/api/v1/panel/admin/entities/{notary_id}/credentials",
            "/api/v1/panel/admin/notaries/{notary_id}/credentials",
        }
        self.assertTrue(expected.issubset(paths), expected - paths)


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