"""
Пример 2: Автоматическая привязка с bindAuto

Демонстрация автоматической привязки к различным типам виджетов:
- QLineEdit, QTextEdit - текстовая привязка
- QSpinBox, QSlider - числовая привязка
- QCheckBox - привязка состояния
- QComboBox - привязка текущего текста
"""

import sys

from qtpy.QtWidgets import (
    QApplication, QWidget, QVBoxLayout, QGridLayout,
    QLabel, QLineEdit, QSpinBox, QSlider, QCheckBox, QComboBox
)
from qtmvvm import BaseViewModel


class PersonViewModel(BaseViewModel):
    """ViewModel для данных человека"""
    name: str = "John"
    age: int = 25
    is_student: bool = False
    city: str = "Москва"


class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Пример 2: Автоматическая привязка bindAuto")
        
        # Создаём ViewModel
        self.vm = PersonViewModel()

        self.name_edit = QLineEdit()
        self.age_spin = QSpinBox()
        self.age_spin.setRange(0, 150)
        self.age_slider = QSlider()
        # self.age_slider.setOrientation()  # Horizontal
        self.age_slider.setMinimum(0)
        self.age_slider.setMaximum(150)
        self.student_check = QCheckBox("Студент")
        self.city_combo = QComboBox()
        self.city_combo.addItems(["Москва", "Санкт-Петербург", "Казань", "Новосибирск"])
        
        # Автоматическая привязка - bindAuto сам определит тип привязки
        self.vm.name @ self.name_edit
        self.vm.age @ self.age_spin
        self.vm.age @ self.age_slider  # Одно свойство -> несколько виджетов
        self.vm.is_student @ self.student_check
        self.vm.city @ self.city_combo
        
        # Компоновка
        layout = QGridLayout()
        layout.addWidget(QLabel("Имя:"), 0, 0)
        layout.addWidget(self.name_edit, 0, 1)
        
        layout.addWidget(QLabel("Возраст (spin):"), 1, 0)
        layout.addWidget(self.age_spin, 1, 1)
        
        layout.addWidget(QLabel("Возраст (slider):"), 2, 0)
        layout.addWidget(self.age_slider, 2, 1)
        
        layout.addWidget(self.student_check, 3, 0, 1, 2)
        
        layout.addWidget(QLabel("Город:"), 4, 0)
        layout.addWidget(self.city_combo, 4, 1)
        
        self.setLayout(layout)
        
        # Отображаем начальные значения
        print(f"Начальные значения VM: name={self.vm.name}, age={self.vm.age}, "
              f"is_student={self.vm.is_student}, city={self.vm.city}")


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