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

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

from pydantic import BaseModel, Field

BillingMode = Literal["managed", "byok"]


class VoiceConfigResponse(BaseModel):
    project_id: UUID
    enabled: bool
    billing_mode: BillingMode = "managed"
    credential_ref: Optional[str] = None
    max_concurrent_calls: int
    default_agent_id: Optional[UUID] = None
    updated_at: Optional[datetime] = None

    model_config = {"from_attributes": True}


class UpdateVoiceConfigRequest(BaseModel):
    enabled: Optional[bool] = None
    billing_mode: Optional[BillingMode] = None
    credential_ref: Optional[str] = Field(default=None, max_length=128)
    max_concurrent_calls: Optional[int] = Field(default=None, ge=1, le=500)
    default_agent_id: Optional[UUID] = None


class VoiceAgentResponse(BaseModel):
    id: UUID
    project_id: UUID
    name: str
    version: str
    provider: str
    model: Optional[str] = None
    voice: Optional[str] = None
    instructions: Optional[str] = None
    tools_json: Optional[list[dict[str, Any]]] = None
    transfer_targets_json: Optional[list[dict[str, Any]]] = None
    secret_ref: Optional[str] = None
    status: str
    updated_at: Optional[datetime] = None

    model_config = {"from_attributes": True}


class UpsertVoiceAgentRequest(BaseModel):
    name: str
    version: str = "1"
    provider: str = "openai_realtime"
    model: Optional[str] = None
    voice: Optional[str] = None
    instructions: Optional[str] = None
    tools_json: Optional[list[dict[str, Any]]] = None
    transfer_targets_json: Optional[list[dict[str, Any]]] = None
    secret_ref: Optional[str] = None
    status: str = "active"


class PhoneNumberResponse(BaseModel):
    id: UUID
    project_id: UUID
    e164: str
    provider: str
    provider_sid: Optional[str] = None
    inbound_agent_id: Optional[UUID] = None
    outbound_agent_id: Optional[UUID] = None
    status: str
    updated_at: Optional[datetime] = None

    model_config = {"from_attributes": True}


class UpsertPhoneNumberRequest(BaseModel):
    e164: str
    provider: str = "twilio"
    provider_sid: Optional[str] = None
    inbound_agent_id: Optional[UUID] = None
    outbound_agent_id: Optional[UUID] = None
    status: str = "active"


class VoiceInboundResolution(BaseModel):
    """Attached onto Cloud grant policy_snapshot — never raw secrets."""

    agent_id: Optional[str] = None
    agent_config_version: Optional[str] = None
    phone_number_id: Optional[str] = None
    voice_provider: str = "openai_realtime"
    model: Optional[str] = None
    voice: Optional[str] = None
    instructions: Optional[str] = None
    max_call_seconds: int = 3600
    max_concurrent_calls: int = 1
    tools: list[dict[str, Any]] = Field(default_factory=list)
    transfer_targets: list[dict[str, Any]] = Field(default_factory=list)
    secret_ref: Optional[str] = None
    billing_mode: str = "managed"
    credential_ref: Optional[str] = None
    usage_product: str = "voice"
