"""Tek bir sahneyi temsil eden, düzenlenebilir kart bileşeni."""
from __future__ import annotations
from pathlib import Path

from PySide6.QtCore import Qt, Signal
from PySide6.QtGui import QPixmap
from PySide6.QtWidgets import (
    QFrame, QVBoxLayout, QHBoxLayout, QLabel, QPushButton, QPlainTextEdit,
    QSpinBox, QDoubleSpinBox, QCheckBox, QSizePolicy, QWidget, QGridLayout,
)

from model import Sahne
from .ortak import DosyaSecici, GorselOnizleme, GORSEL_FORMATLARI, SES_FORMATLARI
from .oynatici import MedyaOynatici


class SahneKarti(QFrame):
    """Bir sahneyi düzenleyebilen kart."""

    degisti = Signal(str)                 # sahne_id
    silinmeyi_istedi = Signal(str)        # sahne_id
    yeniden_uretilmeyi_istedi = Signal(str)  # sahne_id
    yukari = Signal(str)
    asagi = Signal(str)

    def __init__(self, sahne: Sahne, parent=None):
        super().__init__(parent)
        self.sahne = sahne
        self.setObjectName("sahneKarti")
        self.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed)

        ana = QVBoxLayout(self)
        ana.setContentsMargins(12, 10, 12, 10)
        ana.setSpacing(8)

        # ── Üst satır: sıra no + durum + işlem butonları ──
        ust = QHBoxLayout()
        self.basl = QLabel(f"🎬 Sahne #{sahne.sira + 1}")
        self.basl.setStyleSheet("font-weight: 700; font-size: 14px;")
        self.durum_etiket = QLabel(self._durum_metni())
        self.durum_etiket.setStyleSheet(self._durum_stili())

        ust.addWidget(self.basl)
        ust.addWidget(self.durum_etiket)
        ust.addStretch(1)

        btn_up = QPushButton("▲")
        btn_up.setFixedWidth(28)
        btn_up.setToolTip("Yukarı taşı")
        btn_up.clicked.connect(lambda: self.yukari.emit(self.sahne.id))

        btn_dn = QPushButton("▼")
        btn_dn.setFixedWidth(28)
        btn_dn.setToolTip("Aşağı taşı")
        btn_dn.clicked.connect(lambda: self.asagi.emit(self.sahne.id))

        self.btn_uret = QPushButton("🔄 Yeniden Üret")
        self.btn_uret.setObjectName("birincil")
        self.btn_uret.clicked.connect(lambda: self.yeniden_uretilmeyi_istedi.emit(self.sahne.id))

        btn_sil = QPushButton("🗑")
        btn_sil.setObjectName("tehlike")
        btn_sil.setFixedWidth(34)
        btn_sil.clicked.connect(lambda: self.silinmeyi_istedi.emit(self.sahne.id))

        ust.addWidget(btn_up)
        ust.addWidget(btn_dn)
        ust.addWidget(self.btn_uret)
        ust.addWidget(btn_sil)
        ana.addLayout(ust)

        # ── Orta: görsel önizleme (sol) + parametreler (sağ) ──
        orta = QHBoxLayout()
        orta.setSpacing(12)

        # sol: görseller
        sol = QVBoxLayout()
        sol.setSpacing(6)
        self.giris_onizleme = GorselOnizleme(min_yukseklik=120)
        self.giris_onizleme.setMinimumWidth(200)
        self.giris_onizleme.setToolTip("Giriş görseli")
        sol.addWidget(QLabel("Giriş görseli:"))
        sol.addWidget(self.giris_onizleme)

        self.son_kare_onizleme = GorselOnizleme(min_yukseklik=100)
        self.son_kare_onizleme.setMinimumWidth(200)
        self.son_kare_onizleme.setToolTip("Üretilen son kare")
        sol.addWidget(QLabel("Son kare:"))
        sol.addWidget(self.son_kare_onizleme)
        orta.addLayout(sol, 1)

        # sağ: prompt + ayarlar
        sag = QVBoxLayout()
        sag.setSpacing(6)

        sag.addWidget(QLabel("Prompt:"))
        self.prompt = QPlainTextEdit()
        self.prompt.setPlainText(sahne.prompt)
        self.prompt.setFixedHeight(60)
        self.prompt.setPlaceholderText("boş bırak → projedeki global prompt kullanılır")
        self.prompt.textChanged.connect(self._alan_degisti)
        sag.addWidget(self.prompt)

        grid = QGridLayout()
        grid.setHorizontalSpacing(10)
        grid.setVerticalSpacing(6)

        grid.addWidget(QLabel("Süre (s):"), 0, 0)
        self.sure = QSpinBox()
        self.sure.setRange(5, 20)
        self.sure.setValue(sahne.sure)
        self.sure.valueChanged.connect(self._alan_degisti)
        grid.addWidget(self.sure, 0, 1)

        grid.addWidget(QLabel("Seed:"), 0, 2)
        self.seed = QSpinBox()
        self.seed.setRange(-1, 2147483647)
        self.seed.setValue(sahne.seed)
        self.seed.setSpecialValueText("rastgele")
        self.seed.valueChanged.connect(self._alan_degisti)
        grid.addWidget(self.seed, 0, 3)

        grid.addWidget(QLabel("Guidance:"), 1, 0)
        self.guidance = QDoubleSpinBox()
        self.guidance.setRange(1.0, 15.0)
        self.guidance.setSingleStep(0.5)
        self.guidance.setValue(sahne.guidance_scale)
        self.guidance.valueChanged.connect(self._alan_degisti)
        grid.addWidget(self.guidance, 1, 1)

        grid.addWidget(QLabel("Steps:"), 1, 2)
        self.steps = QSpinBox()
        self.steps.setRange(10, 80)
        self.steps.setValue(sahne.steps)
        self.steps.valueChanged.connect(self._alan_degisti)
        grid.addWidget(self.steps, 1, 3)

        sag.addLayout(grid)

        self.face_aktif = QCheckBox("Bu sahnede face swap uygula")
        self.face_aktif.setChecked(sahne.face_swap_aktif)
        self.face_aktif.stateChanged.connect(self._alan_degisti)
        sag.addWidget(self.face_aktif)

        self.face_sec = DosyaSecici("Yüz (override)", GORSEL_FORMATLARI)
        if sahne.face_swap_kaynak:
            self.face_sec.yolu_ayarla(sahne.face_swap_kaynak)
        self.face_sec.degisti.connect(self._alan_degisti)
        sag.addWidget(self.face_sec)

        orta.addLayout(sag, 2)
        ana.addLayout(orta)

        # Üretilen video segmenti oynatıcı (başlangıçta gizli)
        self.oynatici = MedyaOynatici(video=True, kompakt=True)
        self.oynatici.setVisible(False)
        ana.addWidget(self.oynatici)

        # ilk görselleri yükle
        if sahne.giris_gorsel:
            self.giris_onizleme.yukle(sahne.giris_gorsel)
        if sahne.son_kare:
            self.son_kare_onizleme.yukle(sahne.son_kare)
        if sahne.cikis_video:
            self._oynaticiyi_goster(sahne.cikis_video)

    # --------------------------------------------------------------- yardım
    def _durum_metni(self) -> str:
        return {
            "beklemede": "⏳ beklemede",
            "uretiliyor": "⚙ üretiliyor...",
            "tamamlandi": "✓ tamamlandı",
            "hata": "✗ hata",
            "iptal": "✕ iptal",
        }.get(self.sahne.durum, self.sahne.durum)

    def _durum_stili(self) -> str:
        renk = {
            "beklemede": "#9ca3af",
            "uretiliyor": "#60a5fa",
            "tamamlandi": "#22c55e",
            "hata": "#ef4444",
            "iptal": "#f59e0b",
        }.get(self.sahne.durum, "#9ca3af")
        return f"color: {renk}; font-weight: 600; padding: 4px 10px; background-color: rgba(255,255,255,0.04); border-radius: 6px;"

    def _alan_degisti(self, *_):
        self.sahne.prompt = self.prompt.toPlainText()
        self.sahne.sure = self.sure.value()
        self.sahne.seed = self.seed.value()
        self.sahne.guidance_scale = self.guidance.value()
        self.sahne.steps = self.steps.value()
        self.sahne.face_swap_aktif = self.face_aktif.isChecked()
        self.sahne.face_swap_kaynak = self.face_sec.yol()
        self.degisti.emit(self.sahne.id)

    def _oynaticiyi_goster(self, video_yolu: str) -> None:
        if video_yolu and Path(video_yolu).exists():
            self.oynatici.dosya_yukle(video_yolu)
            self.oynatici.setVisible(True)
            self.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.MinimumExpanding)

    # --------------------------------------------------------------- API
    def goruntuyu_yenile(self) -> None:
        self.basl.setText(f"🎬 Sahne #{self.sahne.sira + 1}")
        self.durum_etiket.setText(self._durum_metni())
        self.durum_etiket.setStyleSheet(self._durum_stili())
        self.setProperty("uretiliyor", self.sahne.durum == "uretiliyor")
        self.setProperty("tamam", self.sahne.durum == "tamamlandi")
        self.setProperty("hatali", self.sahne.durum == "hata")
        self.style().unpolish(self)
        self.style().polish(self)

        if self.sahne.giris_gorsel and Path(self.sahne.giris_gorsel).exists():
            self.giris_onizleme.yukle(self.sahne.giris_gorsel)
        if self.sahne.son_kare and Path(self.sahne.son_kare).exists():
            self.son_kare_onizleme.yukle(self.sahne.son_kare)
        if self.sahne.cikis_video and Path(self.sahne.cikis_video).exists():
            if self.oynatici.dosya() != self.sahne.cikis_video:
                self._oynaticiyi_goster(self.sahne.cikis_video)
