# -*- coding: utf-8 -*-
# gui/components/radio_group.py
"""Контейнеризированная обёртка над QButtonGroup."""

from __future__ import annotations

from PySide6.QtWidgets import QButtonGroup

from gui.containers.s_container import SContainer


class RadioGroup(SContainer):
    """Логическая группа RadioButton с взаимоисключающим выбором.

    Оборачивает ``QButtonGroup`` в ``SContainer``-совместимый компонент,
    исключая прямое использование Qt-классов в прикладном коде.

    Визуально компонент невидим (zero-size), используется только для
    логической привязки RadioButton друг к другу.
    """

    def __init__(
        self,
        exclusive: bool = True,
        parent=None,
    ):
        super().__init__(
            width_percent=None,
            height_percent=None,
            margin=0,
            parent=parent,
        )
        self.setFixedSize(0, 0)
        self._group = QButtonGroup(self)
        self._group.setExclusive(exclusive)

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

    def add_button(self, radio_button) -> None:
        """Добавить ``RadioButton`` в группу."""
        radio_button.add_to_group(self._group)

    def set_exclusive(self, exclusive: bool) -> None:
        self._group.setExclusive(exclusive)

    def is_exclusive(self) -> bool:
        return self._group.exclusive()

    @property
    def button_clicked(self):
        """Сигнал ``QButtonGroup.buttonClicked``."""
        return self._group.buttonClicked

    @property
    def button_toggled(self):
        """Сигнал ``QButtonGroup.buttonToggled``."""
        return self._group.buttonToggled


# ---------------------------------------------------------------------------
# Module workflow notes
# ---------------------------------------------------------------------------
#
# 1) Назначение модуля:
#    Логическая группа RadioButton с взаимоисключающим выбором,
#    оборачивающая QButtonGroup в SContainer-совместимый компонент.
#    Визуально невидим (fixedSize 0×0), используется только для
#    логической привязки.
#
# 2) Зависимости модуля:
#    Импорты: QButtonGroup (PySide6.QtWidgets),
#             SContainer (gui.containers.s_container)
#    Хост-класс / базовый класс: SContainer
#    Внешние библиотеки: PySide6 (обязательна)
#
# 3) Экспорт:
#    Класс RadioGroup — публичный компонент логической группировки.
#    Методы: add_button(RadioButton), set_exclusive(bool), is_exclusive().
#    Свойства: button_clicked, button_toggled (сигналы QButtonGroup).
#
# 4) Состояние (поля):
#    _group: QButtonGroup — внутренняя группа кнопок
#
# 5) Последовательность действий и вызовов:
#    __init__(exclusive=True, parent=None)
#      -> super().__init__(...) -> setFixedSize(0, 0)
#      -> QButtonGroup(self) -> setExclusive(exclusive)
#    add_button(radio_button)
#      -> radio_button.add_to_group(_group)
#         (делегирует RadioButton → group.addButton)
#
# 6) Побочные эффекты:
#    - Модифицирует QButtonGroup (добавление кнопок, смена exclusive).
#    - Размер виджета зафиксирован 0×0 — невидимый.
#
# 7) Границы ответственности:
#    Модуль НЕ управляет визуальным представлением кнопок.
#    НЕ применяет стили. НЕ подключается к theme_bus.
#
# 8) Обработка ошибок:
#    Нет явной обработки. Ожидает корректный RadioButton на входе.
#
# 9) Инварианты и контракты:
#    - По умолчанию exclusive=True — только одна кнопка может быть выбрана.
#    - FixedSize(0, 0) — виджет не занимает место в layout.
#
# 10) Правило сопровождения:
#     Не добавлять визуальные элементы. Не менять размер с 0×0.
#     add_button() принимает только RadioButton (не QRadioButton напрямую).
