"""Video sekmesi: global ayarlar + sahne timeline + üretim kontrolleri."""
from __future__ import annotations
from typing import Dict, List

from PySide6.QtCore import Qt, Signal
from PySide6.QtWidgets import (
    QWidget, QVBoxLayout, QHBoxLayout, QLabel, QPushButton, QPlainTextEdit,
    QComboBox, QSpinBox, QDoubleSpinBox, QScrollArea, QFrame, QGroupBox,
    QGridLayout, QCheckBox, QProgressBar, QSizePolicy,
)

from model import Proje, Sahne, MAX_SURE
from .sahne_karti import SahneKarti
from .oynatici import MedyaOynatici


class VideoSekmesi(QWidget):
    proje_degisti = Signal()
    uretim_istendi = Signal(list)       # uretilecek sahne_id listesi (boş=tümü)
    iptal_istendi = Signal()
    birlestirme_istendi = Signal()
    otomatik_sahne_uret = Signal(int)   # kaç sahne (ses bölümü temelli)

    def __init__(self, proje: Proje, parent=None):
        super().__init__(parent)
        self.proje = proje
        self._kartlar: Dict[str, SahneKarti] = {}

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

        ana.addWidget(self._genel_ayarlar_paneli())
        ana.addWidget(self._uretim_paneli())
        ana.addWidget(self._sahne_paneli(), 1)

    # ----------------------------------------------------- GENEL AYARLAR
    def _genel_ayarlar_paneli(self) -> QWidget:
        grp = QGroupBox("⚙ Global Video Ayarları")
        grid = QGridLayout(grp)
        grid.setHorizontalSpacing(14)
        grid.setVerticalSpacing(8)

        grid.addWidget(QLabel("Çözünürlük:"), 0, 0)
        self.cozunurluk = QComboBox()
        self.cozunurluk.addItems(["512p", "540p", "720p", "1080p"])
        self.cozunurluk.setCurrentText(self.proje.ayarlar.video.cozunurluk)
        self.cozunurluk.currentTextChanged.connect(self._ayar_degisti)
        grid.addWidget(self.cozunurluk, 0, 1)

        grid.addWidget(QLabel("Oran:"), 0, 2)
        self.oran = QComboBox()
        self.oran.addItems(["16:9", "9:16"])
        self.oran.setCurrentText(self.proje.ayarlar.video.oran)
        self.oran.currentTextChanged.connect(self._ayar_degisti)
        grid.addWidget(self.oran, 0, 3)

        grid.addWidget(QLabel("Model:"), 0, 4)
        self.model = QComboBox()
        self.model.addItems(["fast", "pro"])
        self.model.setCurrentText(self.proje.ayarlar.video.model)
        self.model.currentTextChanged.connect(self._ayar_degisti)
        grid.addWidget(self.model, 0, 5)

        grid.addWidget(QLabel("Segment (s):"), 1, 0)
        self.segment_sure = QSpinBox()
        self.segment_sure.setRange(5, 20)
        self.segment_sure.setValue(self.proje.ayarlar.video.segment_sure)
        self.segment_sure.valueChanged.connect(self._ayar_degisti)
        grid.addWidget(self.segment_sure, 1, 1)

        grid.addWidget(QLabel("Guidance:"), 1, 2)
        self.guidance = QDoubleSpinBox()
        self.guidance.setRange(1.0, 15.0)
        self.guidance.setSingleStep(0.5)
        self.guidance.setValue(self.proje.ayarlar.video.guidance_scale)
        self.guidance.valueChanged.connect(self._ayar_degisti)
        grid.addWidget(self.guidance, 1, 3)

        grid.addWidget(QLabel("Steps:"), 1, 4)
        self.steps = QSpinBox()
        self.steps.setRange(10, 80)
        self.steps.setValue(self.proje.ayarlar.video.steps)
        self.steps.valueChanged.connect(self._ayar_degisti)
        grid.addWidget(self.steps, 1, 5)

        grid.addWidget(QLabel("Global prompt:"), 2, 0, alignment=Qt.AlignmentFlag.AlignTop)
        self.global_prompt = QPlainTextEdit()
        self.global_prompt.setPlainText(self.proje.ayarlar.video.global_prompt)
        self.global_prompt.setFixedHeight(60)
        self.global_prompt.textChanged.connect(self._ayar_degisti)
        grid.addWidget(self.global_prompt, 2, 1, 1, 5)

        grid.addWidget(QLabel("Negatif prompt:"), 3, 0, alignment=Qt.AlignmentFlag.AlignTop)
        self.neg_prompt = QPlainTextEdit()
        self.neg_prompt.setPlainText(self.proje.ayarlar.video.global_negatif)
        self.neg_prompt.setFixedHeight(50)
        self.neg_prompt.textChanged.connect(self._ayar_degisti)
        grid.addWidget(self.neg_prompt, 3, 1, 1, 5)

        self.face_aktif = QCheckBox("Global face swap aktif (sol panelden yüz seçin)")
        self.face_aktif.setChecked(self.proje.ayarlar.video.face_swap_aktif)
        self.face_aktif.stateChanged.connect(self._ayar_degisti)
        grid.addWidget(self.face_aktif, 4, 0, 1, 6)

        return grp

    # ------------------------------------------------------- ÜRETİM PANEL
    def _uretim_paneli(self) -> QWidget:
        grp = QGroupBox("🚀 Üretim Kontrolleri")
        layout = QHBoxLayout(grp)
        layout.setSpacing(8)

        self.otomatik_btn = QPushButton("🎞 Sesten Sahne Oluştur")
        self.otomatik_btn.setToolTip("Sesi segment süresine göre böler ve sahne sayısı kadar sahne oluşturur")
        self.otomatik_btn.clicked.connect(self._otomatik_sahne_istegi)

        self.sahne_ekle_btn = QPushButton("+ Boş Sahne Ekle")
        self.sahne_ekle_btn.clicked.connect(self._sahne_ekle)

        self.uret_btn = QPushButton("▶ TÜM SAHNELERİ ÜRET")
        self.uret_btn.setObjectName("birincil")
        self.uret_btn.clicked.connect(lambda: self.uretim_istendi.emit([]))

        self.iptal_btn = QPushButton("⏹ İptal")
        self.iptal_btn.setObjectName("tehlike")
        self.iptal_btn.setEnabled(False)
        self.iptal_btn.clicked.connect(self.iptal_istendi.emit)

        self.birlestir_btn = QPushButton("🎬 Birleştir + Ses Ekle")
        self.birlestir_btn.clicked.connect(self.birlestirme_istendi.emit)

        for b in (self.otomatik_btn, self.sahne_ekle_btn, self.uret_btn,
                  self.iptal_btn, self.birlestir_btn):
            layout.addWidget(b)

        # ilerleme alanı
        self.ilerleme_bar = QProgressBar()
        self.ilerleme_bar.setRange(0, 100)
        self.ilerleme_bar.setValue(0)
        self.ilerleme_bar.setFormat("Hazır")

        # Nihai video önizlemesi (üretim bitince aktifleşir)
        nihai_grp = QGroupBox("🎬 Nihai Video Önizleme")
        ng = QVBoxLayout(nihai_grp)
        self.nihai_oynatici = MedyaOynatici(video=True, kompakt=False)
        self.nihai_oynatici.setEnabled(False)
        ng.addWidget(self.nihai_oynatici)
        self.nihai_etiket = QLabel("Nihai video henüz üretilmedi.")
        self.nihai_etiket.setStyleSheet("color: #9ca3af; padding: 4px;")
        ng.addWidget(self.nihai_etiket)

        sarmak = QVBoxLayout()
        sarmak.addWidget(grp)
        sarmak.addWidget(self.ilerleme_bar)
        sarmak.addWidget(nihai_grp)

        w = QWidget()
        w.setLayout(sarmak)
        return w

    # --------------------------------------------------------- API
    def nihai_video_yukle(self, dosya: str) -> None:
        from pathlib import Path as _P
        if dosya and _P(dosya).exists():
            self.nihai_oynatici.dosya_yukle(dosya)
            self.nihai_oynatici.setEnabled(True)
            self.nihai_etiket.setText(f"✓ {dosya}")
            self.nihai_etiket.setStyleSheet("color: #22c55e; padding: 4px; font-weight: 600;")

    # -------------------------------------------------------- SAHNE PANEL
    def _sahne_paneli(self) -> QWidget:
        grp = QGroupBox("🎞 Sahneler")
        l = QVBoxLayout(grp)

        self.scroll = QScrollArea()
        self.scroll.setWidgetResizable(True)

        self.icerik = QWidget()
        self.icerik_layout = QVBoxLayout(self.icerik)
        self.icerik_layout.setContentsMargins(4, 4, 4, 4)
        self.icerik_layout.setSpacing(8)
        self.icerik_layout.addStretch(1)

        self.scroll.setWidget(self.icerik)
        l.addWidget(self.scroll)
        return grp

    # ----------------------------------------------------------- yardım
    def _ayar_degisti(self, *_):
        v = self.proje.ayarlar.video
        v.cozunurluk = self.cozunurluk.currentText()
        v.oran = self.oran.currentText()
        v.model = self.model.currentText()
        v.segment_sure = self.segment_sure.value()
        v.guidance_scale = self.guidance.value()
        v.steps = self.steps.value()
        v.global_prompt = self.global_prompt.toPlainText()
        v.global_negatif = self.neg_prompt.toPlainText()
        v.face_swap_aktif = self.face_aktif.isChecked()

        # Çözünürlük değişti ise max süreyi aşan sahneleri kırp
        max_s = MAX_SURE.get(v.cozunurluk, 10)
        if self.segment_sure.value() > max_s:
            self.segment_sure.setValue(max_s)

        self.proje_degisti.emit()

    def _sahne_ekle(self) -> None:
        s = Sahne(sure=self.proje.ayarlar.video.segment_sure,
                  guidance_scale=self.proje.ayarlar.video.guidance_scale,
                  steps=self.proje.ayarlar.video.steps,
                  prompt=self.proje.ayarlar.video.global_prompt)
        self.proje.sahne_ekle(s)
        # İlk sahne giriş görseli için proje kaynak görseli
        if len(self.proje.sahneler) == 1 and self.proje.kaynak_gorsel:
            s.giris_gorsel = self.proje.kaynak_gorsel
        self.sahneleri_yenile()
        self.proje_degisti.emit()

    def _otomatik_sahne_istegi(self):
        self.otomatik_sahne_uret.emit(self.segment_sure.value())

    # ----------------------------------------------------------- API
    def sahneleri_yenile(self) -> None:
        """Mevcut sahnelere göre kart listesini yeniden üret."""
        # Eski kartları kaldır
        while self.icerik_layout.count() > 0:
            it = self.icerik_layout.takeAt(0)
            if it.widget():
                it.widget().deleteLater()
        self._kartlar.clear()

        if not self.proje.sahneler:
            bos = QLabel("Henüz sahne yok. Sesten oluştur veya + Boş Sahne Ekle'ye basın.")
            bos.setAlignment(Qt.AlignmentFlag.AlignCenter)
            bos.setStyleSheet("color: #6b7280; padding: 30px; font-style: italic;")
            self.icerik_layout.addWidget(bos)
        else:
            for s in self.proje.sahneler:
                k = SahneKarti(s)
                k.degisti.connect(lambda _id: self.proje_degisti.emit())
                k.silinmeyi_istedi.connect(self._sahne_sil)
                k.yeniden_uretilmeyi_istedi.connect(
                    lambda sid: self.uretim_istendi.emit([sid])
                )
                k.yukari.connect(self._yukari)
                k.asagi.connect(self._asagi)
                self._kartlar[s.id] = k
                self.icerik_layout.addWidget(k)

        self.icerik_layout.addStretch(1)

    def sahne_yenile(self, sahne_id: str) -> None:
        k = self._kartlar.get(sahne_id)
        if k:
            k.goruntuyu_yenile()

    def _sahne_sil(self, sahne_id: str) -> None:
        self.proje.sahne_sil(sahne_id)
        self.sahneleri_yenile()
        self.proje_degisti.emit()

    def _yukari(self, sahne_id: str) -> None:
        s = self.proje.sahne_bul(sahne_id)
        if s and s.sira > 0:
            self.proje.sahne_tasi(sahne_id, s.sira - 1)
            self.sahneleri_yenile()
            self.proje_degisti.emit()

    def _asagi(self, sahne_id: str) -> None:
        s = self.proje.sahne_bul(sahne_id)
        if s and s.sira < len(self.proje.sahneler) - 1:
            self.proje.sahne_tasi(sahne_id, s.sira + 1)
            self.sahneleri_yenile()
            self.proje_degisti.emit()

    def ilerleme_guncelle(self, mevcut: int, toplam: int, aciklama: str) -> None:
        if toplam > 0:
            self.ilerleme_bar.setRange(0, toplam)
            self.ilerleme_bar.setValue(mevcut)
            self.ilerleme_bar.setFormat(f"{mevcut}/{toplam} — {aciklama}")
        else:
            self.ilerleme_bar.setRange(0, 0)
            self.ilerleme_bar.setFormat(aciklama)

    def uretim_modu(self, aktif: bool) -> None:
        """Üretim sırasında bazı butonları kilitle."""
        self.uret_btn.setEnabled(not aktif)
        self.otomatik_btn.setEnabled(not aktif)
        self.sahne_ekle_btn.setEnabled(not aktif)
        self.iptal_btn.setEnabled(aktif)
