using System.Linq;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Input;
using Avalonia.Layout;
using Avalonia.Media;
using ClaudeDo.Ui.ViewModels;
using ClaudeDo.Ui.ViewModels.Islands;
using ClaudeDo.Ui.ViewModels.Modals;
using ClaudeDo.Ui.Views.Modals;

namespace ClaudeDo.Ui.Views;

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        KeyDown += OnWindowKeyDown;
        DataContextChanged += OnDataContextChanged;
        UpdateMaxIcon();
    }

    protected override void OnPropertyChanged(AvaloniaPropertyChangedEventArgs change)
    {
        base.OnPropertyChanged(change);
        if (change.Property == WindowStateProperty)
            UpdateMaxIcon();
        if (change.Property == OffScreenMarginProperty)
            RootGrid.Margin = OffScreenMargin;
    }

    private void UpdateMaxIcon()
    {
        var key = WindowState == WindowState.Maximized ? "Icon.WinRestore" : "Icon.WinMax";
        if (this.TryFindResource(key, out var geometry) && geometry is Geometry g)
            MaxIcon.Data = g;
    }

    private void OnDataContextChanged(object? sender, EventArgs e)
    {
        if (DataContext is IslandsShellViewModel vm)
        {
            vm.Dialogs = new WindowDialogService(this);
        }
    }

    private void OnWindowKeyDown(object? sender, KeyEventArgs e)
    {
        if (e.Key == Key.Space
            && FocusManager?.GetFocusedElement() is not TextBox
            && DataContext is IslandsShellViewModel vm)
        {
            e.Handled = true;
            _ = vm.ToggleSelectedDoneAsync();
        }
    }

    private void OnTitleBarPressed(object? sender, PointerPressedEventArgs e)
    {
        if (e.GetCurrentPoint(this).Properties.IsLeftButtonPressed)
            BeginMoveDrag(e);
    }
    private void OnMinimize(object? s, Avalonia.Interactivity.RoutedEventArgs e) =>
        WindowState = WindowState.Minimized;
    private void OnToggleMax(object? s, Avalonia.Interactivity.RoutedEventArgs e) =>
        WindowState = WindowState == WindowState.Maximized ? WindowState.Normal : WindowState.Maximized;
    private void OnClose(object? s, Avalonia.Interactivity.RoutedEventArgs e) => Close();

    protected override void OnSizeChanged(SizeChangedEventArgs e)
    {
        base.OnSizeChanged(e);
        if (DataContext is IslandsShellViewModel vm) vm.WindowWidth = Bounds.Width;
    }

}
