"""Pydantic veri modelleri - WanGP köprü servisi için."""

from __future__ import annotations

from typing import Any, Literal

from pydantic import BaseModel, Field


# ----------------------------------------------------------------------------
# İstek/Yanıt modelleri
# ----------------------------------------------------------------------------

class JobIstek(BaseModel):
    """Yeni bir üretim işi başlatma isteği."""

    settings: dict[str, Any] = Field(
        ...,
        description="WanGP task settings sözlüğü. En az 'model_type' ve 'prompt' olmalı.",
    )
    etiket: str | None = Field(
        default=None,
        description="Opsiyonel kullanıcı etiketi (UI'da gösterim için).",
    )


class JobYanit(BaseModel):
    """Yeni iş oluşturulduğunda dönen yanıt."""

    job_id: str
    durum: str = "kuyruk"
    olusturma_zamani: float


class IptalYanit(BaseModel):
    ok: bool
    mesaj: str = ""


class SilYanit(BaseModel):
    ok: bool
    mesaj: str = ""


# ----------------------------------------------------------------------------
# Olay (event) modelleri
# ----------------------------------------------------------------------------

OlayTuru = Literal[
    "started",
    "progress",
    "preview",
    "stream",
    "status",
    "info",
    "output",
    "completed",
    "error",
    "refresh_models",
    "ping",
]


class OlayKaydi(BaseModel):
    """SSE stream üzerinden gönderilen tek bir olay."""

    kind: OlayTuru
    data: Any = None
    ts: float


# ----------------------------------------------------------------------------
# Durum modelleri
# ----------------------------------------------------------------------------

class IlerlemeKaydi(BaseModel):
    """Bir işin anlık durumu."""

    job_id: str
    durum: Literal["kuyruk", "calisiyor", "tamam", "iptal", "hata"]
    ilerleme: int = 0
    faz: str = ""
    mesaj: str = ""
    su_anki_adim: int | None = None
    toplam_adim: int | None = None
    olusturma_zamani: float
    baslangic_zamani: float | None = None
    bitis_zamani: float | None = None
    son_olay_zamani: float | None = None
    etiket: str | None = None


class JobOzet(BaseModel):
    """Job listesinde her bir kayıt için kısa özet."""

    job_id: str
    durum: str
    ilerleme: int
    faz: str
    olusturma_zamani: float
    bitis_zamani: float | None = None
    etiket: str | None = None
    model_type: str | None = None


class SonucYanit(BaseModel):
    """Tamamlanmış bir işin sonucu."""

    job_id: str
    success: bool
    generated_files: list[str] = []
    errors: list[str] = []
    cancelled: bool = False
    total_tasks: int = 0
    successful_tasks: int = 0
    failed_tasks: int = 0


# ----------------------------------------------------------------------------
# Model & LoRA katalog modelleri
# ----------------------------------------------------------------------------

ModelTipi = Literal[
    "video_i2v",
    "video_t2v",
    "video_lipsync",
    "image",
    "audio_tts",
    "postprocess",
    "diger",
]


class ModelKaydi(BaseModel):
    """defaults/*.json klasöründen okunmuş tek bir model tanımı."""

    id: str
    ad: str
    tip: ModelTipi
    aciklama: str = ""
    architecture: str = ""
    resolution: str | None = None
    video_length: int | None = None
    num_inference_steps: int | None = None
    guidance_scale: float | None = None
    flow_shift: float | None = None
    image_outputs: bool = False
    video_outputs: bool = False
    audio_outputs: bool = False
    lock_inference_steps: bool = False
    urls: list[str] = []


class LoraKaydi(BaseModel):
    """loras/ + loras_metadata/ klasörlerinden okunmuş LoRA tanımı."""

    dosya: str
    ad: str
    klasor: str = ""
    boyut_byte: int = 0
    tetik_kelimeler: list[str] = []
    onerilen_agirlik: float | None = None
    aciklama: str = ""


# ----------------------------------------------------------------------------
# Sağlık & yardımcı modeller
# ----------------------------------------------------------------------------

class GpuBilgi(BaseModel):
    ad: str = ""
    vram_kullanim_mb: float = 0.0
    vram_toplam_mb: float = 0.0


class SaglikYanit(BaseModel):
    durum: Literal["ok", "hata"]
    wangp_yuklu: bool = False
    model_aktif: str | None = None
    aktif_job_sayisi: int = 0
    toplam_job_sayisi: int = 0
    gpu: GpuBilgi | None = None
    versiyon: str = "1.0.0"


class YuklemeYanit(BaseModel):
    """Multipart yükleme yanıtı."""

    path: str
    isim: str
    boyut_byte: int
    icerik_tipi: str = ""
