"""
Пример 5: Сумматор с командой

Демонстрация:
- Два поля ввода для чисел
- Команда с time.sleep(1) для имитации долгой операции
- Автоматическое обновление результата
"""

import sys
import time
from qtpy.QtWidgets import (
    QApplication, QWidget, QVBoxLayout, QHBoxLayout,
    QLabel, QDoubleSpinBox, QPushButton, QLineEdit
)
from qtmvvm import BaseViewModel, command


class SumViewModel(BaseViewModel):
    """ViewModel для сумматора"""
    num1: float = 0.0
    num2: float = 0.0
    result: float = 0.0
    
    @command
    def calculate(self):
        """Вычислить сумму с задержкой 1 секунда"""
        time.sleep(1)  # Имитация долгой операции
        self.result = self.num1 + self.num2


class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Пример 5: Сумматор с командой")

        self.vm = SumViewModel()

        # Поля ввода чисел
        self.num1_edit = QDoubleSpinBox()
        self.num1_edit.setRange(-1000000, 1000000)
        self.num1_edit.setDecimals(2)
        self.num1_edit.setValue(5.0)
        
        self.num2_edit = QDoubleSpinBox()
        self.num2_edit.setRange(-1000000, 1000000)
        self.num2_edit.setDecimals(2)
        self.num2_edit.setValue(3.0)

        # Кнопка вычисления
        self.calc_button = QPushButton("Вычислить сумму")
        
        # Поле результата (только чтение)
        self.result_edit = QLineEdit()
        self.result_edit.setReadOnly(True)
        
        # Label с текущими значениями
        self.values_label = QLabel("Введите числа:")

        # Привязка полей ввода к свойствам (2-way)
        self.vm.num1 @ self.num1_edit
        self.vm.num2 @ self.num2_edit
        
        # Привязка результата (1-way, только чтение)
        self.vm.result >> self.result_edit

        # Привязка команды к кнопке
        # Кнопка блокируется на время выполнения команды
        self.vm.calculate << self.calc_button

        # Обновление label при изменении чисел
        self.vm.num1.valueChanged.connect(self._update_values_label)
        self.vm.num2.valueChanged.connect(self._update_values_label)
        self._update_values_label()

        # Компоновка
        layout = QVBoxLayout()
        layout.addWidget(self.values_label)
        
        h_layout = QHBoxLayout()
        h_layout.addWidget(QLabel("Число 1:"))
        h_layout.addWidget(self.num1_edit)
        h_layout.addWidget(QLabel("Число 2:"))
        h_layout.addWidget(self.num2_edit)
        layout.addLayout(h_layout)
        
        layout.addWidget(self.calc_button)
        
        result_layout = QHBoxLayout()
        result_layout.addWidget(QLabel("Результат:"))
        result_layout.addWidget(self.result_edit)
        layout.addLayout(result_layout)

        self.setLayout(layout)

    def _update_values_label(self):
        """Обновить label с текущими значениями"""
        self.values_label.setText(
            f"Введите числа: {self.vm.num1.value} + {self.vm.num2.value}"
        )


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