"""Sol panel: proje, kaynak dosyalar, backend durumu."""
from __future__ import annotations
from pathlib import Path
from typing import Optional

from PySide6.QtCore import Qt, Signal
from PySide6.QtWidgets import (
    QWidget, QVBoxLayout, QHBoxLayout, QLabel, QPushButton,
    QFrame, QGroupBox, QSizePolicy,
)

from .ortak import DosyaSecici, DurumNoktasi, GorselOnizleme, BolunmePaneli, GORSEL_FORMATLARI, SES_FORMATLARI


class SolPanel(QWidget):
    """Proje adı, kaynak dosyalar, backend durumu, proje işlemleri."""

    # Dosya değişim sinyalleri
    ses_degisti = Signal(str)
    gorsel_degisti = Signal(str)
    face_kaynak_degisti = Signal(str)

    # Proje eylemleri
    proje_yeni = Signal()
    proje_ac = Signal()
    proje_kaydet = Signal()
    proje_farkli_kaydet = Signal()

    # Backend eylemleri
    ltx_baslat = Signal()
    ace_baslat = Signal()

    def __init__(self, parent=None):
        super().__init__(parent)
        self.setMinimumWidth(320)
        self.setMaximumWidth(400)

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

        # ── Başlık ──
        basl = QLabel("🎬 FikoYT Video Stüdyosu")
        basl.setObjectName("baslik")
        basl.setWordWrap(True)
        ana.addWidget(basl)

        # ── Proje paneli ──
        proje = BolunmePaneli("📁 Proje")
        self.proje_adi = QLabel("İsimsiz Proje")
        self.proje_adi.setStyleSheet("font-weight: 600; font-size: 14px;")
        proje.icerik_ekle(self.proje_adi)

        self.proje_yol = QLabel("— kaydedilmedi —")
        self.proje_yol.setObjectName("etiket")
        self.proje_yol.setWordWrap(True)
        proje.icerik_ekle(self.proje_yol)

        btn_layout = QHBoxLayout()
        btn_yeni = QPushButton("Yeni")
        btn_ac = QPushButton("Aç")
        btn_kaydet = QPushButton("Kaydet")
        for b in (btn_yeni, btn_ac, btn_kaydet):
            btn_layout.addWidget(b)
        proje.ana_layout.addLayout(btn_layout)
        btn_yeni.clicked.connect(self.proje_yeni.emit)
        btn_ac.clicked.connect(self.proje_ac.emit)
        btn_kaydet.clicked.connect(self.proje_kaydet.emit)

        btn_fk = QPushButton("Farklı Kaydet")
        btn_fk.clicked.connect(self.proje_farkli_kaydet.emit)
        proje.icerik_ekle(btn_fk)
        ana.addWidget(proje)

        # ── Kaynak dosyalar ──
        kaynak = BolunmePaneli("🎵 Kaynak Dosyalar")
        self.ses_sec = DosyaSecici("Şarkı/Ses", SES_FORMATLARI)
        self.gorsel_sec = DosyaSecici("Görsel", GORSEL_FORMATLARI)
        self.face_sec = DosyaSecici("Yüz (face-swap)", GORSEL_FORMATLARI)
        kaynak.icerik_ekle(self.ses_sec)
        kaynak.icerik_ekle(self.gorsel_sec)
        kaynak.icerik_ekle(self.face_sec)

        self.ses_sec.degisti.connect(self.ses_degisti.emit)
        self.gorsel_sec.degisti.connect(self._gorsel_degisti)
        self.face_sec.degisti.connect(self._face_degisti)

        self.gorsel_onizleme = GorselOnizleme(min_yukseklik=140)
        kaynak.icerik_ekle(self.gorsel_onizleme)
        ana.addWidget(kaynak)

        # ── Backend durumu ──
        backend = BolunmePaneli("🔌 Backend Durumu")

        # LTX
        ltx_satir = QHBoxLayout()
        self.ltx_nokta = DurumNoktasi()
        self.ltx_nokta.durumu_ayarla("pasif")
        self.ltx_etiket = QLabel("LTX Desktop: kontrol ediliyor...")
        self.ltx_etiket.setWordWrap(True)
        ltx_satir.addWidget(self.ltx_nokta)
        ltx_satir.addWidget(self.ltx_etiket, 1)
        backend.ana_layout.addLayout(ltx_satir)

        self.ltx_baslat_btn = QPushButton("▶ LTX Desktop Başlat")
        self.ltx_baslat_btn.clicked.connect(self.ltx_baslat.emit)
        backend.icerik_ekle(self.ltx_baslat_btn)

        backend.icerik_ekle(self._ayirici())

        # ACE-Step
        ace_satir = QHBoxLayout()
        self.ace_nokta = DurumNoktasi()
        self.ace_nokta.durumu_ayarla("pasif")
        self.ace_etiket = QLabel("ACE-Step: kontrol ediliyor...")
        self.ace_etiket.setWordWrap(True)
        ace_satir.addWidget(self.ace_nokta)
        ace_satir.addWidget(self.ace_etiket, 1)
        backend.ana_layout.addLayout(ace_satir)

        self.ace_baslat_btn = QPushButton("▶ ACE-Step API Başlat")
        self.ace_baslat_btn.clicked.connect(self.ace_baslat.emit)
        backend.icerik_ekle(self.ace_baslat_btn)

        ana.addWidget(backend)
        ana.addStretch(1)

    # --------------------------------------------------------------- yardım
    def _ayirici(self) -> QFrame:
        f = QFrame()
        f.setFrameShape(QFrame.Shape.HLine)
        f.setStyleSheet("color: #262c38;")
        return f

    def _gorsel_degisti(self, yol: str) -> None:
        self.gorsel_onizleme.yukle(yol)
        self.gorsel_degisti.emit(yol)

    def _face_degisti(self, yol: str) -> None:
        self.face_kaynak_degisti.emit(yol)

    # --------------------------------------------------------------- API
    def ltx_durumu_guncelle(self, calisyor: bool, url: str) -> None:
        if calisyor:
            self.ltx_nokta.durumu_ayarla("ok")
            self.ltx_etiket.setText(f"LTX Desktop: ✓ bağlı\n{url}")
            self.ltx_baslat_btn.setEnabled(False)
            self.ltx_baslat_btn.setText("✓ LTX çalışıyor")
        else:
            self.ltx_nokta.durumu_ayarla("hata")
            self.ltx_etiket.setText("LTX Desktop: bulunamadı")
            self.ltx_baslat_btn.setEnabled(True)
            self.ltx_baslat_btn.setText("▶ LTX Desktop Başlat")

    def ace_durumu_guncelle(self, calisyor: bool, url: str) -> None:
        if calisyor:
            self.ace_nokta.durumu_ayarla("ok")
            self.ace_etiket.setText(f"ACE-Step: ✓ bağlı\n{url}")
            self.ace_baslat_btn.setEnabled(False)
            self.ace_baslat_btn.setText("✓ ACE-Step çalışıyor")
        else:
            self.ace_nokta.durumu_ayarla("hata")
            self.ace_etiket.setText(f"ACE-Step: bulunamadı\n{url}")
            self.ace_baslat_btn.setEnabled(True)
            self.ace_baslat_btn.setText("▶ ACE-Step API Başlat")

    def proje_bilgisini_guncelle(self, ad: str, yol: str) -> None:
        self.proje_adi.setText(ad)
        self.proje_yol.setText(yol or "— kaydedilmedi —")
