"""
Пример 7: Консольная демонстрация (без GUI)

Демонстрация работы ObservableProperty и BaseViewModel
без графического интерфейса
"""

from qtmvvm import ObservableProperty, BaseViewModel, computed_property


def test_basic_property():
    """Базовое использование ObservableProperty"""
    print("=== Базовое использование ObservableProperty ===\n")
    
    # Создание свойства
    name = ObservableProperty("Alice")
    print(f"Создано свойство: name = {name.value}")
    
    # Изменение значения
    name.value = "Bob"
    print(f"После изменения: name = {name.value}")
    
    # Подписка на изменения
    def on_change(value):
        print(f"  -> Событие valueChanged: {value}")
    
    name.valueChanged.connect(on_change)
    name.value = "Charlie"
    
    print()


def test_property_operators():
    """Операторы привязки"""
    print("=== Операторы привязки ===\n")
    
    prop = ObservableProperty(10)
    print(f"Начальное значение: {prop.value}")
    
    # Операторы с числами (прокси)
    print(f"prop >> 2 = {prop >> 2} (битовый сдвиг)")
    print(f"prop + 5 = {prop + 5}")
    print(f"prop * 3 = {prop * 3}")
    
    # Операторы сравнения
    print(f"prop > 5 = {prop > 5}")
    print(f"prop == 10 = {prop == 10}")
    
    print()


def test_viewmodel():
    """Использование BaseViewModel"""
    print("=== BaseViewModel ===\n")
    
    class Person(BaseViewModel):
        name: str = "John"
        age: int = 30
        city: str = "London"
    
    person = Person()
    print(f"Создан Person: {person.name}, {person.age} лет, {person.city}")
    
    # Изменение свойств
    person.name = "Jane"
    person.age = 25
    print(f"После изменений: {person.name}, {person.age} лет, {person.city}")
    
    # Подписка на изменения
    def on_name_change(value):
        print(f"  -> Имя изменено на: {value}")
    
    person.get_property("name").valueChanged.connect(on_name_change)
    person.name = "Bob"
    
    print()


def test_computed_property():
    """Вычисляемые свойства"""
    print("=== ComputedProperty ===\n")
    
    class Rectangle(BaseViewModel):
        width: int = 10
        height: int = 5
        
        @computed_property(depends_on=["width", "height"])
        def area(self) -> int:
            return self.width * self.height
        
        @computed_property(depends_on=["width", "height"])
        def perimeter(self) -> int:
            return 2 * (self.width + self.height)
    
    rect = Rectangle()
    print(f"Прямоугольник: {rect.width}x{rect.height}")
    print(f"Площадь: {rect.area}")
    print(f"Периметр: {rect.perimeter}")
    
    # Изменение размеров
    print("\nИзменяем ширину на 20...")
    rect.width = 20
    print(f"Новая площадь: {rect.area}")
    print(f"Новый периметр: {rect.perimeter}")
    
    print()


def test_property_chaining():
    """Цепочки операций"""
    print("=== Цепочки операций ===\n")
    
    prop = ObservableProperty(100)
    
    # Арифметические операции
    result = prop + 50 - 30
    print(f"(prop + 50 - 30) = {result}")
    
    result = prop * 2 / 4
    print(f"(prop * 2 / 4) = {result}")
    
    # Операции присваивания
    prop += 10
    print(f"prop += 10 -> {prop.value}")
    
    prop *= 2
    print(f"prop *= 2 -> {prop.value}")
    
    print()


if __name__ == "__main__":
    test_basic_property()
    test_property_operators()
    test_viewmodel()
    test_computed_property()
    test_property_chaining()
    
    print("=== Все демонстрации завершены! ===")
