"""Yeniden kullanılabilir küçük UI bileşenleri."""
from __future__ import annotations
from pathlib import Path
from typing import Optional

from PySide6.QtCore import Qt, QSize, Signal
from PySide6.QtGui import QPixmap, QColor, QPainter, QBrush
from PySide6.QtWidgets import (
    QFrame, QLabel, QVBoxLayout, QHBoxLayout, QWidget,
    QPushButton, QFileDialog, QSizePolicy,
)


GORSEL_FORMATLARI = "Görseller (*.png *.jpg *.jpeg *.webp *.bmp)"
SES_FORMATLARI = "Ses dosyaları (*.mp3 *.wav *.flac *.m4a *.ogg)"
VIDEO_FORMATLARI = "Video (*.mp4 *.mov *.mkv *.avi)"


class DurumNoktasi(QWidget):
    """Yeşil/kırmızı/sarı yuvarlak durum göstergesi."""

    def __init__(self, boyut: int = 10, parent=None):
        super().__init__(parent)
        self.setFixedSize(QSize(boyut, boyut))
        self._renk = QColor("#6b7280")

    def durumu_ayarla(self, renk_adi: str) -> None:
        """ok | hata | bekle | pasif"""
        renkler = {
            "ok": "#22c55e",
            "hata": "#ef4444",
            "bekle": "#f59e0b",
            "pasif": "#6b7280",
        }
        self._renk = QColor(renkler.get(renk_adi, "#6b7280"))
        self.update()

    def paintEvent(self, e):
        p = QPainter(self)
        p.setRenderHint(QPainter.RenderHint.Antialiasing)
        p.setBrush(QBrush(self._renk))
        p.setPen(Qt.PenStyle.NoPen)
        p.drawEllipse(0, 0, self.width(), self.height())


class DosyaSecici(QWidget):
    """Dosya yolu gösteren + 'Seç' butonu olan bileşen."""

    degisti = Signal(str)

    def __init__(self, etiket: str, filtre: str = "*.*",
                 varsayilan_dizin: str = "", parent=None):
        super().__init__(parent)
        self.filtre = filtre
        self.varsayilan_dizin = varsayilan_dizin
        self._yol = ""

        layout = QHBoxLayout(self)
        layout.setContentsMargins(0, 0, 0, 0)
        layout.setSpacing(6)

        self.etiket = QLabel(etiket)
        self.etiket.setObjectName("etiket")
        self.etiket.setFixedWidth(110)

        self.yol_etiket = QLabel("— seçilmedi —")
        self.yol_etiket.setObjectName("etiket")
        self.yol_etiket.setStyleSheet("color: #6b7280; font-style: italic;")
        self.yol_etiket.setWordWrap(False)
        self.yol_etiket.setTextInteractionFlags(Qt.TextInteractionFlag.TextSelectableByMouse)
        self.yol_etiket.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred)

        self.sec_btn = QPushButton("Seç")
        self.sec_btn.setFixedWidth(60)
        self.sec_btn.clicked.connect(self._sec)

        self.temizle_btn = QPushButton("✕")
        self.temizle_btn.setFixedWidth(28)
        self.temizle_btn.clicked.connect(lambda: self.yolu_ayarla(""))

        layout.addWidget(self.etiket)
        layout.addWidget(self.yol_etiket, 1)
        layout.addWidget(self.sec_btn)
        layout.addWidget(self.temizle_btn)

    def _sec(self) -> None:
        yol, _ = QFileDialog.getOpenFileName(
            self, "Dosya seç",
            self._yol or self.varsayilan_dizin, self.filtre,
        )
        if yol:
            self.yolu_ayarla(yol)

    def yolu_ayarla(self, yol: str) -> None:
        self._yol = yol
        if yol:
            ad = Path(yol).name
            self.yol_etiket.setText(ad)
            self.yol_etiket.setToolTip(yol)
            self.yol_etiket.setStyleSheet("color: #e5e7eb; font-style: normal;")
        else:
            self.yol_etiket.setText("— seçilmedi —")
            self.yol_etiket.setToolTip("")
            self.yol_etiket.setStyleSheet("color: #6b7280; font-style: italic;")
        self.degisti.emit(yol)

    def yol(self) -> str:
        return self._yol


class GorselOnizleme(QLabel):
    """Verilen dosya yolunu ölçeklenmiş şekilde gösteren resim kutusu."""

    def __init__(self, min_yukseklik: int = 140, parent=None):
        super().__init__(parent)
        self.setMinimumHeight(min_yukseklik)
        self.setAlignment(Qt.AlignmentFlag.AlignCenter)
        self.setStyleSheet("""
            QLabel {
                background-color: #0a0c10;
                border: 1px dashed #262c38;
                border-radius: 8px;
                color: #6b7280;
            }
        """)
        self.setText("(önizleme yok)")
        self._yol = ""

    def yukle(self, yol: str) -> None:
        self._yol = yol
        if not yol or not Path(yol).exists():
            self.setText("(önizleme yok)")
            self.setPixmap(QPixmap())
            return
        pm = QPixmap(yol)
        if pm.isNull():
            self.setText("(yüklenemedi)")
            return
        self.setPixmap(pm.scaled(self.size(), Qt.AspectRatioMode.KeepAspectRatio,
                                 Qt.TransformationMode.SmoothTransformation))

    def resizeEvent(self, e):
        super().resizeEvent(e)
        if self._yol:
            self.yukle(self._yol)


class BolunmePaneli(QFrame):
    """Başlığı olan çerçeveli panel (object adı 'panel')."""

    def __init__(self, baslik: str = "", parent=None):
        super().__init__(parent)
        self.setObjectName("panel")
        self.ana_layout = QVBoxLayout(self)
        self.ana_layout.setContentsMargins(14, 12, 14, 12)
        self.ana_layout.setSpacing(10)
        if baslik:
            lbl = QLabel(baslik)
            lbl.setObjectName("altbaslik")
            self.ana_layout.addWidget(lbl)

    def icerik_ekle(self, widget: QWidget) -> None:
        self.ana_layout.addWidget(widget)
