from __future__ import annotations

import re

from config.base import Config
from config.control_plane import get_tenant_assignment, resolve_tenant_by_host


_ROUTING_KEY_RE = re.compile(r"^[a-z0-9_]+$")


def sanitize_routing_key(routing_key: str | None) -> str | None:
    if routing_key is None:
        return None
    value = routing_key.strip().lower()
    if not value:
        return None
    if not _ROUTING_KEY_RE.fullmatch(value):
        raise ValueError(f"Invalid routing_key: {routing_key!r}")
    return value


def build_tenant_db_name(routing_key: str) -> str:
    safe_key = sanitize_routing_key(routing_key)
    if safe_key is None:
        raise ValueError("routing_key is required")
    return f"tenant_{safe_key}"


def resolve_db_name(hostname: str | None = None, routing_key: str | None = None) -> str:
    safe_routing_key = sanitize_routing_key(routing_key) if routing_key else None

    if safe_routing_key:
        assignment = get_tenant_assignment(safe_routing_key)
        if assignment and assignment.get("tenant_db_name"):
            return assignment["tenant_db_name"]
        return build_tenant_db_name(safe_routing_key)

    tenant = resolve_tenant_by_host(hostname)
    if tenant:
        tenant_routing_key = tenant.get("routing_key")
        if tenant_routing_key:
            assignment = get_tenant_assignment(tenant_routing_key)
            if assignment and assignment.get("tenant_db_name"):
                return assignment["tenant_db_name"]
            return build_tenant_db_name(tenant_routing_key)

    return Config.DB_NAME
