"""Proje modeli: sahneler + ayarlar + kaydet/yükle."""
from __future__ import annotations
from dataclasses import dataclass, field
from pathlib import Path
from typing import List, Optional
import json
import uuid

from .sahne import Sahne
from .ayarlar import TumAyarlar


@dataclass
class Proje:
    id: str = field(default_factory=lambda: uuid.uuid4().hex[:12])
    ad: str = "İsimsiz Proje"
    kaynak_ses: str = ""            # ana şarkı dosyası (opsiyonel)
    kaynak_gorsel: str = ""         # ilk sahnenin giriş görseli
    sahneler: List[Sahne] = field(default_factory=list)
    ayarlar: TumAyarlar = field(default_factory=TumAyarlar)
    proje_dosyasi: str = ""         # kaydedildiği yol
    cikis_video: str = ""           # nihai birleştirilmiş video

    # ── Sahne yönetimi ──
    def sahne_ekle(self, s: Optional[Sahne] = None) -> Sahne:
        s = s or Sahne()
        s.sira = len(self.sahneler)
        self.sahneler.append(s)
        return s

    def sahne_sil(self, sahne_id: str) -> bool:
        ilk = len(self.sahneler)
        self.sahneler = [s for s in self.sahneler if s.id != sahne_id]
        self._sira_yenile()
        return len(self.sahneler) < ilk

    def sahne_bul(self, sahne_id: str) -> Optional[Sahne]:
        return next((s for s in self.sahneler if s.id == sahne_id), None)

    def sahne_tasi(self, sahne_id: str, hedef_sira: int) -> None:
        s = self.sahne_bul(sahne_id)
        if not s:
            return
        self.sahneler.remove(s)
        hedef_sira = max(0, min(hedef_sira, len(self.sahneler)))
        self.sahneler.insert(hedef_sira, s)
        self._sira_yenile()

    def _sira_yenile(self) -> None:
        for i, s in enumerate(self.sahneler):
            s.sira = i

    # ── JSON kaydet / yükle ──
    def kaydet(self, yol: Optional[str] = None) -> str:
        yol = yol or self.proje_dosyasi
        if not yol:
            raise ValueError("Kaydedilecek yol yok")
        self.proje_dosyasi = str(Path(yol).resolve())
        veri = {
            "id": self.id,
            "ad": self.ad,
            "kaynak_ses": self.kaynak_ses,
            "kaynak_gorsel": self.kaynak_gorsel,
            "sahneler": [s.dict() for s in self.sahneler],
            "ayarlar": self.ayarlar.dict(),
            "cikis_video": self.cikis_video,
        }
        Path(self.proje_dosyasi).write_text(
            json.dumps(veri, indent=2, ensure_ascii=False), encoding="utf-8"
        )
        return self.proje_dosyasi

    @classmethod
    def yukle(cls, yol: str) -> "Proje":
        d = json.loads(Path(yol).read_text(encoding="utf-8"))
        p = cls(
            id=d.get("id", uuid.uuid4().hex[:12]),
            ad=d.get("ad", "İsimsiz Proje"),
            kaynak_ses=d.get("kaynak_ses", ""),
            kaynak_gorsel=d.get("kaynak_gorsel", ""),
            sahneler=[Sahne.sozlukten(s) for s in d.get("sahneler", [])],
            ayarlar=TumAyarlar.sozlukten(d.get("ayarlar", {})),
            cikis_video=d.get("cikis_video", ""),
        )
        p.proje_dosyasi = str(Path(yol).resolve())
        p._sira_yenile()
        return p
