"""Hosting control-plane request/response models."""
from __future__ import annotations

from typing import Any, Literal, Optional

from pydantic import BaseModel, Field


class DispatchRouteUpsert(BaseModel):
    """Map ``{subdomain}.{HOSTING_PUBLIC_APEX}`` to an existing W4P user Worker script name."""

    subdomain: str = Field(..., min_length=1, description="Single DNS label (e.g. my-app)")
    script_name: str = Field(..., min_length=1, max_length=63, description="Dispatch namespace user Worker name")
    environment: Literal["production", "preview", "staging"] = "production"
    project_ref: Optional[str] = Field(
        None,
        description="Stored for project:* KV keys; if omitted, derived from script_name when it matches "
        "p2hs-prod-{ref} / p2hs-prev-{ref} (managed proxy Workers), else tpl-{subdomain}",
    )
    project_id: str = Field(
        "",
        description="Core project UUID string; if empty, filled from DB when project_ref matches a project row.",
    )
    target_url: Optional[str] = Field(
        None,
        description="Optional metadata URL; defaults to https://{hostname}/",
    )
    sync_dispatcher: bool = Field(
        False,
        description="If true, redeploy the dispatcher Worker (zone route + script) after KV write.",
    )


class DispatchRouteResponse(BaseModel):
    hostname: str
    kv_key: str
    script_name: str
    environment: str
    project_ref: str
    project_id: Optional[str] = None
    dispatcher: Optional[dict[str, Any]] = None
