"""Ses sekmesi: ACE-Step ile şarkı üretimi."""
from __future__ import annotations
from pathlib import Path

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

from model.ayarlar import SesAyarlari
from .oynatici import MedyaOynatici


GOREVLER = {
    "text2music": "Text → Müzik (sıfırdan üret)",
    "retake": "Retake (tekrar dene)",
    "repaint": "Repaint (belirli kısmı yeniden üret)",
    "edit": "Edit (mevcut şarkıyı düzenle)",
    "extend": "Extend (mevcut şarkıyı uzat)",
}


# Lirik uzunluğuna göre önerilen süre (saniye)
def otomatik_sure_tahmini(lirik: str) -> int:
    if not lirik.strip():
        return 60
    # ~2.5 sn / dize, min 30 / max 240
    satir = len([l for l in lirik.splitlines() if l.strip() and not l.strip().startswith("[")])
    return max(30, min(240, int(satir * 2.5) + 30))


def otomatik_caption(mevcut: str = "") -> str:
    if mevcut.strip():
        return mevcut
    return "pop, uplifting, warm female vocals, 110 bpm, key of C major, acoustic guitar, soft drums, cinematic"


class SesSekmesi(QWidget):
    """ACE-Step üretim arayüzü."""

    uret_istendi = Signal()
    iptal_istendi = Signal()
    videoya_aktar_istendi = Signal(str)  # üretilen dosya yolu

    def __init__(self, ayar: SesAyarlari, parent=None):
        super().__init__(parent)
        self.ayar = ayar
        self._son_uretilen = ""

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

        ana.addWidget(self._parametre_paneli())
        ana.addWidget(self._lirik_caption_paneli(), 1)
        ana.addWidget(self._kontrol_paneli())

    # ------------------------------------------------------- parametreler
    def _parametre_paneli(self) -> QWidget:
        grp = QGroupBox("🎵 Üretim Parametreleri")
        g = QGridLayout(grp)
        g.setHorizontalSpacing(14)
        g.setVerticalSpacing(8)

        g.addWidget(QLabel("Görev:"), 0, 0)
        self.gorev = QComboBox()
        for k, v in GOREVLER.items():
            self.gorev.addItem(v, k)
        idx = list(GOREVLER.keys()).index(self.ayar.gorev) if self.ayar.gorev in GOREVLER else 0
        self.gorev.setCurrentIndex(idx)
        self.gorev.currentIndexChanged.connect(self._degisti)
        g.addWidget(self.gorev, 0, 1, 1, 3)

        g.addWidget(QLabel("Süre (s):"), 1, 0)
        sure_kutu = QHBoxLayout()
        self.sure = QSpinBox()
        self.sure.setRange(10, 480)
        self.sure.setValue(self.ayar.sure)
        self.sure.valueChanged.connect(self._degisti)
        sure_kutu.addWidget(self.sure)
        self.otomatik_sure = QCheckBox("🪄 Otomatik")
        self.otomatik_sure.setToolTip("Süre liriklerden otomatik hesaplanır")
        self.otomatik_sure.toggled.connect(self._otomatik_toggle)
        sure_kutu.addWidget(self.otomatik_sure)
        sure_w = QWidget()
        sure_w.setLayout(sure_kutu)
        g.addWidget(sure_w, 1, 1)

        g.addWidget(QLabel("Inference adımı:"), 1, 2)
        self.infer = QSpinBox()
        self.infer.setRange(4, 60)
        self.infer.setValue(self.ayar.infer_step)
        self.infer.valueChanged.connect(self._degisti)
        g.addWidget(self.infer, 1, 3)

        g.addWidget(QLabel("Guidance:"), 2, 0)
        self.guidance = QDoubleSpinBox()
        self.guidance.setRange(1.0, 30.0)
        self.guidance.setSingleStep(0.5)
        self.guidance.setValue(self.ayar.guidance_scale)
        self.guidance.valueChanged.connect(self._degisti)
        g.addWidget(self.guidance, 2, 1)

        g.addWidget(QLabel("Seed (-1=rastgele):"), 2, 2)
        self.seed = QSpinBox()
        self.seed.setRange(-1, 2147483647)
        self.seed.setValue(self.ayar.seed)
        self.seed.setSpecialValueText("rastgele")
        self.seed.valueChanged.connect(self._degisti)
        g.addWidget(self.seed, 2, 3)

        g.addWidget(QLabel("API URL:"), 3, 0)
        self.api = QLineEdit(self.ayar.api_url)
        self.api.textChanged.connect(self._degisti)
        g.addWidget(self.api, 3, 1, 1, 3)

        return grp

    # --------------------------------------------------- caption + lyrics
    def _lirik_caption_paneli(self) -> QWidget:
        grp = QGroupBox("✍ Caption & Lirikler")
        l = QVBoxLayout(grp)

        l.addWidget(QLabel("Caption (tür, BPM, enstrüman, mood, anahtar):"))
        self.caption = QPlainTextEdit(self.ayar.caption)
        self.caption.setPlaceholderText("örn: pop, uplifting female vocals, 120 bpm, key of C major, energetic drums")
        self.caption.setFixedHeight(80)
        self.caption.textChanged.connect(self._degisti)
        l.addWidget(self.caption)

        l.addWidget(QLabel("Lirikler (ACE-Step formatı, sessizse boş bırak):"))
        self.lyrics = QPlainTextEdit(self.ayar.lirikler)
        self.lyrics.setPlaceholderText("[verse]\nFirst line of verse\n[chorus]\nChorus line here\n...")
        self.lyrics.textChanged.connect(self._degisti)
        l.addWidget(self.lyrics, 1)

        return grp

    # --------------------------------------------------------- kontroller
    def _kontrol_paneli(self) -> QWidget:
        grp = QGroupBox("🚀 Üretim")
        v = QVBoxLayout(grp)

        btns = QHBoxLayout()
        self.oto_btn = QPushButton("🪄 Otomatik Ayarla")
        self.oto_btn.setToolTip("Tüm parametreleri akıllı varsayılanlara sıfırlar")
        self.oto_btn.clicked.connect(self._otomatik_ayarla)
        btns.addWidget(self.oto_btn)

        self.uret_btn = QPushButton("▶ ŞARKI ÜRET")
        self.uret_btn.setObjectName("ikincil")
        self.uret_btn.clicked.connect(self.uret_istendi.emit)
        btns.addWidget(self.uret_btn)

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

        self.aktar_btn = QPushButton("🎬 Video Pipeline'ına Aktar")
        self.aktar_btn.setObjectName("birincil")
        self.aktar_btn.setEnabled(False)
        self.aktar_btn.clicked.connect(lambda: self.videoya_aktar_istendi.emit(self._son_uretilen))
        btns.addWidget(self.aktar_btn)
        v.addLayout(btns)

        self.ilerleme = QProgressBar()
        self.ilerleme.setFormat("Hazır")
        v.addWidget(self.ilerleme)

        self.sonuc_etiket = QLabel("Henüz üretim yapılmadı.")
        self.sonuc_etiket.setStyleSheet("color: #9ca3af; padding: 6px;")
        self.sonuc_etiket.setWordWrap(True)
        v.addWidget(self.sonuc_etiket)

        self.oynatici = MedyaOynatici(video=False)
        self.oynatici.setEnabled(False)
        v.addWidget(self.oynatici)

        return grp

    # ----------------------------------------------------------- yardım
    def _degisti(self, *_):
        # Otomatik mod: lirikleri yazdıkça süreyi güncelle
        if hasattr(self, "otomatik_sure") and self.otomatik_sure.isChecked():
            s = otomatik_sure_tahmini(self.lyrics.toPlainText())
            self.sure.blockSignals(True)
            self.sure.setValue(s)
            self.sure.blockSignals(False)
        self.ayar.caption = self.caption.toPlainText()
        self.ayar.lirikler = self.lyrics.toPlainText()
        self.ayar.sure = self.sure.value()
        self.ayar.guidance_scale = self.guidance.value()
        self.ayar.infer_step = self.infer.value()
        self.ayar.seed = self.seed.value()
        self.ayar.gorev = self.gorev.currentData()
        self.ayar.api_url = self.api.text()

    def _otomatik_toggle(self, aktif: bool):
        self.sure.setEnabled(not aktif)
        if aktif:
            self.sure.setValue(otomatik_sure_tahmini(self.lyrics.toPlainText()))

    def _otomatik_ayarla(self):
        self.caption.setPlainText(otomatik_caption(self.caption.toPlainText()))
        self.guidance.setValue(15.0)
        self.infer.setValue(27)
        self.seed.setValue(-1)
        self.gorev.setCurrentIndex(0)
        self.otomatik_sure.setChecked(True)
        self.sure.setValue(otomatik_sure_tahmini(self.lyrics.toPlainText()))

    # --------------------------------------------------------------- API
    def uretim_modu(self, aktif: bool) -> None:
        self.uret_btn.setEnabled(not aktif)
        self.iptal_btn.setEnabled(aktif)
        if aktif:
            self.ilerleme.setRange(0, 0)
            self.ilerleme.setFormat("Üretiliyor...")

    def ilerleme_guncelle(self, durum: str, yuzde: float) -> None:
        self.ilerleme.setRange(0, 100)
        self.ilerleme.setValue(int(yuzde))
        self.ilerleme.setFormat(f"{durum} — %{int(yuzde)}")

    def uretim_bitti(self, dosya: str) -> None:
        self._son_uretilen = dosya
        self.ilerleme.setRange(0, 100)
        self.ilerleme.setValue(100)
        self.ilerleme.setFormat("✓ Tamamlandı")
        self.sonuc_etiket.setText(f"✓ Üretildi: {dosya}")
        self.sonuc_etiket.setStyleSheet("color: #22c55e; padding: 6px; font-weight: 600;")
        self.aktar_btn.setEnabled(True)
        self.oynatici.setEnabled(True)
        self.oynatici.dosya_yukle(dosya)
        self.uretim_modu(False)

    def uretim_hatali(self, mesaj: str) -> None:
        self.ilerleme.setRange(0, 100)
        self.ilerleme.setValue(0)
        self.ilerleme.setFormat("✗ Hata")
        self.sonuc_etiket.setText(f"✗ Hata: {mesaj}")
        self.sonuc_etiket.setStyleSheet("color: #ef4444; padding: 6px; font-weight: 600;")
        self.uretim_modu(False)
