"""Resolve hosting providers from settings."""
from __future__ import annotations

from src.config import Settings, get_settings


def get_deployment_provider(settings: Settings | None = None):
    """Return the CF Pages deployment plane provider (or stub)."""
    s = settings or get_settings()
    key = (s.hosting_provider or "stub").strip().lower()
    if key in ("cloudflare_pages", "cloudflare"):
        from src.domain.hosting.adapters.cloudflare_pages import CloudflarePagesProvider
        return CloudflarePagesProvider(s)
    if key == "cloudflare_w4p_static":
        return get_w4p_static_provider(s)
    from src.domain.hosting.adapters.stub_w4p import StubHostingProvider
    return StubHostingProvider(s)


def get_w4p_static_provider(s: Settings, *, environment: str = "production"):
    """W4P static deployment provider for the account in ``s``. Used for both the global and the
    per-project (platform) path, so the KV writes always target the account the settings name."""
    from src.domain.hosting.adapters.w4p_static import W4PStaticDeploymentProvider
    from src.domain.hosting.routing_plane import CloudflareRoutingProvider
    routing = CloudflareRoutingProvider(s)
    env = (environment or "production").strip().lower()
    if env == "preview":
        namespace = s.cloudflare_w4p_namespace_preview or s.cloudflare_w4p_namespace or "p2hs-preview"
    elif env == "staging":
        namespace = s.cloudflare_w4p_namespace_staging or s.cloudflare_w4p_namespace or "p2hs-staging"
    else:
        namespace = s.cloudflare_w4p_namespace_production or s.cloudflare_w4p_namespace or "p2hs-production"
    return W4PStaticDeploymentProvider(
        account_id=s.cloudflare_account_id,
        token=s.cloudflare_api_token,
        namespace=namespace.strip(),
        kv_write=routing._kv_put,
        kv_read=routing._kv_get,
        kv_delete=routing._kv_delete,
        compatibility_date=routing._compat_date,
    )


def get_routing_provider(settings: Settings | None = None):
    """Return the W4P routing plane provider (or stub)."""
    s = settings or get_settings()
    key = (s.hosting_provider or "stub").strip().lower()
    if key in ("cloudflare_pages", "cloudflare", "cloudflare_w4p", "cloudflare_w4p_static", "w4p"):
        from src.domain.hosting.routing_plane import CloudflareRoutingProvider
        return CloudflareRoutingProvider(s)
    from src.domain.hosting.adapters.stub_w4p import StubHostingProvider
    return StubHostingProvider(s)


# Legacy compat — old code called get_hosting_provider()
def get_hosting_provider(settings: Settings | None = None):
    return get_deployment_provider(settings)


def get_runtime_projection_adapter(
    settings: Settings | None = None,
    *,
    provider_id: str | None = None,
):
    """Return the runtime projection for one provider.

    ``provider_id`` is the project's persisted host. When it is omitted, the
    global default is used for callers that have not loaded a project yet.
    """
    from src.domain.hosting.profile import projection_for_provider

    s = settings or get_settings()
    selected = provider_id if provider_id is not None else (s.hosting_provider or "stub")
    return projection_for_provider(selected)
