"""
Пример 5: Форма входа с валидацией

Комплексный пример с:
- Валидацией входных данных
- Блокировкой кнопки при невалидных данных
- Отображением ошибок
"""

import sys
import re
from qtpy.QtWidgets import (
    QApplication, QWidget, QVBoxLayout, QHBoxLayout,
    QLabel, QLineEdit, QPushButton, QCheckBox
)
from qtpy.QtCore import Signal
from qtmvvm import BaseViewModel, computed_property


class LoginViewModel(BaseViewModel):
    """ViewModel для формы входа"""
    username: str = ""
    password: str = ""
    remember: bool = False
    
    @computed_property(depends_on=["username"])
    def username_valid(self) -> bool:
        """Проверка имени пользователя (минимум 3 символа)"""
        return len(self.username) >= 3
    
    @computed_property(depends_on=["username"])
    def username_error(self) -> str:
        """Ошибка имени пользователя"""
        if not self.username:
            return ""
        if not self.username_valid:
            return "Минимум 3 символа"
        return ""
    
    @computed_property(depends_on=["password"])
    def password_valid(self) -> bool:
        """Проверка пароля (минимум 6 символов)"""
        return len(self.password) >= 6
    
    @computed_property(depends_on=["password"])
    def password_error(self) -> str:
        """Ошибка пароля"""
        if not self.password:
            return ""
        if not self.password_valid:
            return "Минимум 6 символов"
        return ""
    
    @computed_property(depends_on=["username_valid", "password_valid"])
    def can_login(self) -> bool:
        """Можно ли войти"""
        return self.username_valid and self.password_valid


class MainWindow(QWidget):
    # Сигнал успешного входа
    login_success = Signal(str)
    
    def __init__(self):
        super().__init__()
        self.setWindowTitle("Пример 5: Форма входа с валидацией")
        self.setMinimumWidth(300)
        
        self.vm = LoginViewModel()
        
        # Поля ввода
        self.username_edit = QLineEdit()
        self.username_edit.setPlaceholderText("Имя пользователя")
        
        self.password_edit = QLineEdit()
        self.password_edit.setPlaceholderText("Пароль")
        self.password_edit.setEchoMode(QLineEdit.Password)
        
        # Чекбокс "Запомнить"
        self.remember_check = QCheckBox("Запомнить меня")
        
        # Кнопка входа
        self.login_btn = QPushButton("Войти")
        self.login_btn.setEnabled(False)
        
        # Метки ошибок
        self.username_error_label = QLabel()
        self.username_error_label.setStyleSheet("color: red; font-size: 12px;")
        
        self.password_error_label = QLabel()
        self.password_error_label.setStyleSheet("color: red; font-size: 12px;")
        
        # Статус
        self.status_label = QLabel()
        self.status_label.setStyleSheet("color: green; font-weight: bold;")
        
        # Привязка полей ввода (2-way)
        self.vm.get_property("username") @ self.username_edit
        self.vm.get_property("password") @ self.password_edit
        self.vm.get_property("remember") @ self.remember_check
        
        # Привязка ошибок (1-way)
        self.vm.get_property("username_error") >> self.username_error_label
        self.vm.get_property("password_error") >> self.password_error_label
        
        # Привязка доступности кнопки
        self.vm.get_property("can_login").valueChanged.connect(
            self.login_btn.setEnabled
        )
        
        # Обработчик кнопки
        self.login_btn.clicked.connect(self.on_login)
        
        # Компоновка
        layout = QVBoxLayout()
        layout.setSpacing(10)
        
        layout.addWidget(QLabel("<b>Вход в систему</b>"))
        
        layout.addWidget(QLabel("Имя пользователя:"))
        layout.addWidget(self.username_edit)
        layout.addWidget(self.username_error_label)
        
        layout.addWidget(QLabel("Пароль:"))
        layout.addWidget(self.password_edit)
        layout.addWidget(self.password_error_label)
        
        layout.addWidget(self.remember_check)
        layout.addWidget(self.login_btn)
        layout.addWidget(self.status_label)
        
        self.setLayout(layout)
    
    def on_login(self):
        """Обработчик входа"""
        if self.vm.can_login:
            remember_text = " (запомнен)" if self.vm.remember else ""
            self.status_label.setText(f"Вход выполнен: {self.vm.username}{remember_text}")
            self.login_success.emit(self.vm.username)


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