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.pro_routes import OperationIn, WebhookIn
from app.core.config import get_settings
from app.main import app


class H9ProContractTests(unittest.TestCase):
    def test_h9_routes_are_registered(self):
        paths = {route.path for route in app.routes}
        expected = {
            "/api/v1/pro", "/api/v1/pro/organizations", "/api/v1/pro/members",
            "/api/v1/pro/cost-centers", "/api/v1/pro/counterparties",
            "/api/v1/pro/operations", "/api/v1/pro/operations/{operation_id}",
            "/api/v1/pro/batches", "/api/v1/pro/reports",
            "/api/v1/pro/integrations", "/api/v1/pro/api-clients",
            "/api/v1/pro/webhooks", "/api/v1/pro/invitations/current",
            "/api/v1/integraciones/pro/v1/operations",
            "/api/v1/integraciones/pro/v1/operations/{operation_id}",
        }
        self.assertTrue(expected.issubset(paths), expected - paths)

    def test_operation_types_are_restricted(self):
        self.assertEqual(OperationIn(contraparte_id=1, tipo="firma", asunto="Contrato").tipo, "FIRMA")
        with self.assertRaises(ValidationError):
            OperationIn(contraparte_id=1, tipo="BORRAR", asunto="Contrato")

    def test_webhook_requires_public_https_destination(self):
        self.assertTrue(WebhookIn(nombre="ERP", url="https://erp.example.cl/documenta").url.startswith("https://"))
        with self.assertRaises(ValidationError):
            WebhookIn(nombre="Local", url="https://127.0.0.1/hook")

    def test_pro_domain_is_trusted(self):
        settings = get_settings()
        self.assertIn("pro.documenta.cl", settings.hosts)
        self.assertIn("https://pro.documenta.cl", settings.origins)


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