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.workspace_routes import ContextIn, DirectRequestIn, RequestStatusIn, TeamMemberIn
from app.core.config import get_settings
from app.main import app


class H7EntityWorkspaceContractTests(unittest.TestCase):
    def test_workspace_routes_are_registered(self):
        paths = {route.path for route in app.routes}
        expected = {
            "/api/v1/panel/workspace",
            "/api/v1/panel/workspace/context",
            "/api/v1/panel/workspace/inbox",
            "/api/v1/panel/workspace/requests/options",
            "/api/v1/panel/workspace/requests",
            "/api/v1/panel/workspace/requests/{request_id}",
            "/api/v1/panel/workspace/requests/{request_id}/status",
            "/api/v1/panel/workspace/documents",
            "/api/v1/panel/workspace/billing",
            "/api/v1/panel/workspace/team",
            "/api/v1/panel/workspace/integrations",
            "/api/v1/panel/workspace/services",
        }
        self.assertTrue(expected.issubset(paths), expected - paths)

    def test_same_context_accepts_all_institutional_capabilities(self):
        for capability in ("notaria", "conservador", "archivero"):
            model = ContextIn(entidad_id=7, capacidad=capability)
            self.assertEqual(model.capacidad, capability.upper())
        with self.assertRaises(ValidationError):
            ContextIn(entidad_id=7, capacidad="empresa")

    def test_direct_request_and_status_contracts_are_bounded(self):
        request = DirectRequestIn(
            oferta_id=10,
            asunto="Solicitud de inscripción",
            mensaje="Se solicita revisar los antecedentes adjuntos.",
            relacion_tipo="dependencia",
        )
        self.assertEqual(request.relacion_tipo, "DEPENDENCIA")
        self.assertEqual(RequestStatusIn(estado="completada").estado, "COMPLETADA")
        with self.assertRaises(ValidationError):
            RequestStatusIn(estado="PAGADA")

    def test_membership_roles_are_entity_scoped(self):
        self.assertEqual(
            TeamMemberIn(email="operaciones@example.cl", rol="facturacion").rol,
            "FACTURACION",
        )
        with self.assertRaises(ValidationError):
            TeamMemberIn(email="operaciones@example.cl", rol="ADMIN_PLATAFORMA")

    def test_workspace_hosts_are_explicitly_allowed(self):
        settings = get_settings()
        for host in (
            "notaria.documenta.cl",
            "cbr.documenta.cl",
            "archivero.documenta.cl",
        ):
            self.assertIn(host, settings.hosts)
            self.assertIn(f"https://{host}", settings.origins)
        self.assertEqual(settings.session_cookie_domain, "")


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