"""Worker Fleet domain — request/response schemas."""
from __future__ import annotations

from datetime import datetime
from typing import Any, Optional
from uuid import UUID

from pydantic import BaseModel, field_validator

_WORKER_NAMES = frozenset(
    {"pc-gateway", "pc-processor", "pc-scheduler", "pc-realtime", "pc-functions"}
)
_WORKER_TYPES = frozenset({"cf_worker", "cf_queue_consumer"})


class WorkerInstanceResponse(BaseModel):
    id: UUID
    worker_name: str
    instance_id: str
    worker_type: str
    current_version: Optional[str] = None
    target_version: Optional[str] = None
    status: str
    cf_script_id: Optional[str] = None
    cf_queue_consumer_id: Optional[str] = None
    cf_queue_id: Optional[str] = None
    current_concurrency: Optional[int] = None
    max_concurrency: Optional[int] = None
    min_concurrency: Optional[int] = None
    scale_up_threshold: Optional[int] = None
    scale_down_threshold: Optional[int] = None
    auto_deploy_enabled: bool
    health_url: Optional[str] = None
    last_health_check_at: Optional[datetime] = None
    last_health_check_ok: Optional[bool] = None
    last_deployed_at: Optional[datetime] = None
    updated_at: datetime

    model_config = {"from_attributes": True}


class FleetSummaryResponse(BaseModel):
    """Aggregate view — all workers grouped by name."""
    workers: list[WorkerGroupResponse]


class WorkerGroupResponse(BaseModel):
    worker_name: str
    worker_type: str
    all_healthy: bool
    healthy_count: int
    total_count: int
    instances: list[WorkerInstanceResponse]


class RegisterWorkerRequest(BaseModel):
    worker_name: str
    instance_id: str
    worker_type: str
    cf_script_id: Optional[str] = None
    cf_queue_consumer_id: Optional[str] = None
    cf_queue_id: Optional[str] = None
    max_concurrency: Optional[int] = None
    min_concurrency: Optional[int] = None
    scale_up_threshold: Optional[int] = None
    scale_down_threshold: Optional[int] = None
    health_url: Optional[str] = None
    auto_deploy_enabled: bool = False

    @field_validator("worker_type")
    @classmethod
    def validate_type(cls, v: str) -> str:
        if v not in _WORKER_TYPES:
            raise ValueError(f"worker_type must be one of: {', '.join(sorted(_WORKER_TYPES))}")
        return v


class DeployWorkerRequest(BaseModel):
    target_version: str
    instance_id: str = "default"


class ScaleWorkerRequest(BaseModel):
    concurrency: int
    instance_id: str = "default"

    @field_validator("concurrency")
    @classmethod
    def validate_concurrency(cls, v: int) -> int:
        if v < 1:
            raise ValueError("concurrency must be at least 1")
        return v


class DeploymentCompleteRequest(BaseModel):
    """Posted by CI after wrangler deploy completes."""
    worker_name: str
    instance_id: str
    version: str
    status: str  # "success" | "failed"
    deployed_at: Optional[datetime] = None
    error: Optional[str] = None

    @field_validator("status")
    @classmethod
    def validate_status(cls, v: str) -> str:
        if v not in ("success", "failed"):
            raise ValueError("status must be 'success' or 'failed'")
        return v


class FleetEventResponse(BaseModel):
    id: UUID
    worker_name: str
    instance_id: str
    event_type: str
    from_value: Optional[str] = None
    to_value: Optional[str] = None
    triggered_by: str
    occurred_at: datetime
    metadata_json: Optional[dict[str, Any]] = None

    model_config = {"from_attributes": True}


class ScalingConfigResponse(BaseModel):
    monitor_interval_seconds: int
    auto_scale_enabled: bool
    deployment_webhook_url: Optional[str] = None

    model_config = {"from_attributes": True}


class UpdateScalingConfigRequest(BaseModel):
    monitor_interval_seconds: Optional[int] = None
    auto_scale_enabled: Optional[bool] = None
    deployment_webhook_url: Optional[str] = None
    deployment_webhook_secret: Optional[str] = None
