# -*- coding: utf-8 -*-
# gui/components/color_swatch.py
"""Цветовой маркер — контейнеризованный компонент."""

from __future__ import annotations

from PySide6.QtGui import QColor, QPainter, QPen, QBrush
from PySide6.QtCore import Qt, QRect
from PySide6.QtWidgets import QWidget, QSizePolicy

from gui.containers.s_container import SContainer


class ColorSwatch(SContainer):
    """Квадрат-маркер цвета зоны.

    Контейнеризованный компонент gui-фреймворка.
    Размеры задаются через ``width_percent`` / ``height_percent``,
    отступы — через ``margin``.
    """

    def __init__(
        self,
        color: str = "#9E9E9EC0",
        width_percent: int | None = None,
        height_percent: int | None = None,
        margin: int | tuple[int, int, int, int] = 0,
        parent: QWidget | None = None,
        style: str | None = None,
        active_style: str | None = None,
        is_active: bool | None = None,
    ):
        super().__init__(
            width_percent=width_percent,
            height_percent=height_percent,
            margin=margin,
            parent=parent,
            style=style,
            active_style=active_style,
            is_active=is_active,
        )

        self._swatch = _SwatchCanvas(color, parent=self)
        self._swatch.setSizePolicy(
            QSizePolicy.Policy.Expanding,
            QSizePolicy.Policy.Expanding,
        )
        self.add_widget(self._swatch)

    # ── Публичный API ─────────────────────────────────────────────

    def set_color(self, color: str) -> None:
        """Установить цвет маркера (hex ``#RRGGBB`` или ``#RRGGBBAA``)."""
        self._swatch.set_color(color)

    def get_color(self) -> str:
        """Вернуть текущий цвет маркера."""
        return self._swatch.get_color()


class _SwatchCanvas(QWidget):
    """Внутренний виджет, рисующий заливку + тонкую рамку."""

    _BORDER_COLOR = QColor("#555555")
    _BORDER_RADIUS = 3

    def __init__(self, color: str, parent: QWidget | None = None):
        super().__init__(parent)
        self._qcolor = QColor(color)
        self._hex = color

    def set_color(self, color: str) -> None:
        self._hex = color
        self._qcolor = QColor(color)
        self.update()

    def get_color(self) -> str:
        return self._hex

    def paintEvent(self, event) -> None:  # noqa: N802
        painter = QPainter(self)
        painter.setRenderHint(QPainter.RenderHint.Antialiasing)

        rect = self.rect().adjusted(1, 1, -1, -1)

        painter.setPen(QPen(self._BORDER_COLOR, 1))
        painter.setBrush(QBrush(self._qcolor))
        painter.drawRoundedRect(rect, self._BORDER_RADIUS, self._BORDER_RADIUS)

        painter.end()


# ---------------------------------------------------------------------------
# Module workflow notes
# ---------------------------------------------------------------------------
#
# 1) Назначение модуля:
#    Цветовой маркер (квадрат) для визуальной индикации цвета зоны,
#    реализованный как SContainer с внутренним виджетом _SwatchCanvas,
#    который рисует заливку и рамку через QPainter.
#
# 2) Зависимости модуля:
#    Импорты: QColor, QPainter, QPen, QBrush (PySide6.QtGui),
#             Qt, QRect (PySide6.QtCore),
#             QWidget, QSizePolicy (PySide6.QtWidgets),
#             SContainer (gui.containers.s_container)
#    Хост-класс / базовый класс: ColorSwatch -> SContainer;
#                                 _SwatchCanvas -> QWidget
#    Внешние библиотеки: PySide6 (обязательна)
#
# 3) Экспорт:
#    Класс ColorSwatch — публичный компонент маркера цвета.
#    Методы: set_color(str), get_color() -> str.
#    Класс _SwatchCanvas — внутренний (непубличный).
#
# 4) Состояние (поля):
#    ColorSwatch:
#      _swatch: _SwatchCanvas — внутренний виджет рисования
#    _SwatchCanvas:
#      _qcolor: QColor        — текущий цвет для заливки
#      _hex: str              — текущий HEX-код цвета
#      _BORDER_COLOR: QColor  — цвет рамки (константа #555555)
#      _BORDER_RADIUS: int    — радиус скругления (константа 3)
#
# 5) Последовательность действий и вызовов:
#    __init__(color, ...)
#      -> super().__init__(...) — SContainer
#      -> _SwatchCanvas(color) -> setSizePolicy(Expanding)
#      -> self.add_widget(_swatch)
#    set_color(color)
#      -> _swatch.set_color(color) -> QColor(color) -> update() [перерисовка]
#    _SwatchCanvas.paintEvent(event)
#      -> QPainter -> drawRoundedRect с заливкой _qcolor и рамкой _BORDER_COLOR
#
# 6) Побочные эффекты:
#    - Перерисовывает виджет при изменении цвета (update()).
#    - Никаких сигналов не испускает.
#
# 7) Границы ответственности:
#    Модуль только отображает цвет. НЕ взаимодействует с theme_bus.
#    НЕ обрабатывает клики. НЕ связан с палитрой или выбором цвета.
#
# 8) Обработка ошибок:
#    Невалидный HEX приводит к QColor.isValid() == False, что Qt обрабатывает
#    как прозрачный/чёрный. Явных проверок нет.
#
# 9) Инварианты и контракты:
#    - _SwatchCanvas.paintEvent всегда рисует прямоугольник с рамкой.
#    - set_color / get_color симметричны по HEX-строке.
#
# 10) Правило сопровождения:
#     При необходимости нового формата цвета (HSL, RGB-кортеж) — расширять
#     set_color() с конвертацией. Не менять paintEvent без проверки antialiasing.
