"""
Пример 4: Миксины для специфичной привязки

Демонстрация использования специфичных методов привязки:
- bindText() - для текстовых виджетов
- bindValue() - для числовых виджетов
- bindChecked() - для чекбоксов
- bindCurrentText() - для комбобоксов
"""

import sys
from qtpy.QtWidgets import (
    QApplication, QWidget, QVBoxLayout, QHBoxLayout,
    QLabel, QLineEdit, QTextEdit, QSpinBox, QSlider,
    QCheckBox, QRadioButton, QComboBox, QButtonGroup
)
from qtmvvm import BaseViewModel


class SettingsViewModel(BaseViewModel):
    """ViewModel для настроек"""
    username: str = "user"
    bio: str = "О себе"
    volume: int = 50
    brightness: int = 75
    notifications: bool = True
    theme: str = "light"


class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Пример 4: Миксины для специфичной привязки")
        
        self.vm = SettingsViewModel()
        
        # === Текстовая привязка ===
        self.username_edit = QLineEdit()
        self.bio_edit = QTextEdit()
        self.bio_edit.setMaximumHeight(60)
        
        # Используем специфичные методы привязки
        self.vm.username @ self.username_edit
        # self.vm.get_property("username").bindText(self.username_edit)
        self.vm.get_property("bio").bindText(self.bio_edit)
        
        # === Числовая привязка ===
        self.volume_spin = QSpinBox()
        self.volume_spin.setRange(0, 100)
        self.volume_slider = QSlider()
        # self.volume_slider.setOrientation(1)  # Horizontal
        self.volume_slider.setRange(0, 100)
        
        self.brightness_spin = QSpinBox()
        self.brightness_spin.setRange(0, 100)
        self.brightness_slider = QSlider()
        # self.brightness_slider.setOrientation(1)
        self.brightness_slider.setRange(0, 100)
        
        # Одно свойство -> несколько виджетов
        self.vm.volume @ self.volume_spin
        self.vm.volume @ self.volume_slider
        # self.vm.get_property("volume").bindValue(self.volume_spin)
        # self.vm.get_property("volume").bindValue(self.volume_slider)
        
        self.vm.get_property("brightness").bindValue(self.brightness_spin)
        self.vm.get_property("brightness").bindValue(self.brightness_slider)
        
        # === Привязка чекбоксов ===
        self.notifications_check = QCheckBox("Включить уведомления")
        self.vm.get_property("notifications").bindChecked(self.notifications_check)
        
        # === Привязка RadioButton через группу ===
        self.theme_group = QButtonGroup()
        self.light_radio = QRadioButton("Светлая")
        self.dark_radio = QRadioButton("Тёмная")
        self.theme_group.addButton(self.light_radio)
        self.theme_group.addButton(self.dark_radio)
        
        # Для RadioButton используем bindChecked с конкретным
        self.vm.get_property("theme").bindCurrentText(
            self._create_theme_combo()
        )
        
        # Компоновка
        layout = QVBoxLayout()
        
        # Секция профиля
        profile_group = QVBoxLayout()
        profile_group.addWidget(QLabel("<b>Профиль</b>"))
        profile_group.addWidget(QLabel("Имя пользователя:"))
        profile_group.addWidget(self.username_edit)
        profile_group.addWidget(QLabel("О себе:"))
        profile_group.addWidget(self.bio_edit)
        layout.addLayout(profile_group)
        
        layout.addWidget(QLabel("<hr>"))
        
        # Секция звука
        sound_group = QVBoxLayout()
        sound_group.addWidget(QLabel("<b>Звук</b>"))
        sound_group.addWidget(QLabel("Громкость:"))
        
        vol_layout = QHBoxLayout()
        vol_layout.addWidget(self.volume_spin)
        vol_layout.addWidget(self.volume_slider)
        sound_group.addLayout(vol_layout)
        layout.addLayout(sound_group)
        
        layout.addWidget(QLabel("<hr>"))
        
        # Секция экрана
        display_group = QVBoxLayout()
        display_group.addWidget(QLabel("<b>Экран</b>"))
        display_group.addWidget(QLabel("Яркость:"))
        
        bright_layout = QHBoxLayout()
        bright_layout.addWidget(self.brightness_spin)
        bright_layout.addWidget(self.brightness_slider)
        display_group.addLayout(bright_layout)
        layout.addLayout(display_group)
        
        layout.addWidget(QLabel("<hr>"))
        
        # Секция уведомлений
        layout.addWidget(QLabel("<b>Уведомления</b>"))
        layout.addWidget(self.notifications_check)
        
        self.setLayout(layout)
    
    def _create_theme_combo(self):
        """Создаёт скрытый комбобокс для привязки темы"""
        combo = QComboBox()
        combo.addItems(["light", "dark"])
        combo.hide()
        return combo


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec())
