from __future__ import annotations

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

from pydantic import BaseModel, Field

Provider = Literal["openai", "anthropic", "google_gemini"]
BillingMode = Literal["managed", "byok"]


class UpdateLivechatConfigRequest(BaseModel):
    enabled: Optional[bool] = None
    provider: Optional[Provider] = None
    billing_mode: Optional[BillingMode] = None
    credential_ref: Optional[str] = Field(default=None, max_length=128)
    model: Optional[str] = Field(default=None, max_length=128)
    instructions: Optional[str] = Field(default=None, max_length=20_000)
    agent_id: Optional[str] = Field(default=None, max_length=128)
    agent_version_id: Optional[str] = Field(default=None, max_length=128)
    tools_json: Optional[list[dict[str, Any]]] = Field(default=None, max_length=16)
    max_tokens: Optional[int] = Field(default=None, ge=1, le=4096)
    transcript_retention_days: Optional[int] = Field(default=None, ge=0, le=365)
    retain_audio: Optional[bool] = None


class LivechatConfigResponse(BaseModel):
    project_id: UUID
    enabled: bool
    provider: Provider
    billing_mode: BillingMode
    credential_ref: Optional[str] = None
    model: Optional[str] = None
    instructions: Optional[str] = None
    agent_id: Optional[str] = None
    agent_version_id: Optional[str] = None
    tools_json: Optional[list[dict[str, Any]]] = None
    max_tokens: int
    transcript_retention_days: int = 30
    retain_audio: bool = False
    entitled: bool = False
    updated_at: Optional[datetime] = None

    model_config = {"from_attributes": True}


class LivechatTranscriptPurgeResponse(BaseModel):
    ok: bool = True
    deleted: int = 0
    remaining: int = 0
