"""Proje geneli video/ses üretim ayarları."""
from __future__ import annotations
from dataclasses import dataclass, field, asdict
from typing import List


# LTX API'nin kabul ettiği süreler (saniye)
IZINLI_SURELER = [5, 6, 8, 10, 20]

# Çözünürlüğe göre max süre
MAX_SURE = {"512p": 20, "540p": 20, "720p": 10, "1080p": 5}


@dataclass
class VideoAyarlari:
    cozunurluk: str = "540p"        # 512p | 540p | 720p | 1080p
    oran: str = "16:9"              # 16:9 | 9:16
    fps: int = 24
    model: str = "fast"             # fast | pro
    segment_sure: int = 20
    global_prompt: str = "cinematic slow motion, beautiful scenery, atmospheric lighting, high quality 4k"
    global_negatif: str = "blurry, low quality, distorted face, extra fingers, multiple people, cartoon"
    guidance_scale: float = 3.5
    steps: int = 30
    face_swap_kaynak: str = ""      # global face swap (sahneler override edebilir)
    face_swap_aktif: bool = False
    kamera_hareketi: str = "none"


@dataclass
class SesAyarlari:
    """ACE-Step şarkı üretim ayarları."""
    api_url: str = "http://127.0.0.1:8001"
    caption: str = "pop, uplifting, female vocals, 120 bpm, key of C major"
    lirikler: str = ""              # ACE-Step formatında (etiketli)
    sure: int = 120                 # saniye
    guidance_scale: float = 15.0
    infer_step: int = 27
    scheduler: str = "euler"
    cfg_type: str = "apg"
    seed: int = -1
    gorev: str = "text2music"       # text2music | retake | repaint | edit | extend


@dataclass
class UygulamaAyarlari:
    proje_dizini: str = ""
    ltx_api_url: str = ""           # otomatik keşfedilir, boşsa arama yapılır
    ltx_token: str = ""
    ace_api_url: str = "http://127.0.0.1:8001"
    ace_api_key: str = ""
    video_uretim_dizini: str = ""   # boşsa output/ altında timestamp


@dataclass
class TumAyarlar:
    video: VideoAyarlari = field(default_factory=VideoAyarlari)
    ses: SesAyarlari = field(default_factory=SesAyarlari)
    uygulama: UygulamaAyarlari = field(default_factory=UygulamaAyarlari)

    def dict(self) -> dict:
        return {
            "video": asdict(self.video),
            "ses": asdict(self.ses),
            "uygulama": asdict(self.uygulama),
        }

    @classmethod
    def sozlukten(cls, d: dict) -> "TumAyarlar":
        return cls(
            video=VideoAyarlari(**d.get("video", {})),
            ses=SesAyarlari(**d.get("ses", {})),
            uygulama=UygulamaAyarlari(**d.get("uygulama", {})),
        )


def en_yakin_izinli_sure(istenen: int, cozunurluk: str) -> int:
    """LTX'in kabul ettiği en yakın (aşağıya yuvarla) süreyi döner."""
    max_dur = MAX_SURE.get(cozunurluk, 10)
    uygun = sorted([s for s in IZINLI_SURELER if s <= max_dur])
    if not uygun:
        return 5
    en_iyi = uygun[0]
    for s in uygun:
        if s <= istenen:
            en_iyi = s
    return en_iyi
