using Avalonia;
using Avalonia.Controls;
using Avalonia.Controls.Presenters;
using Avalonia.Data;
using Avalonia.Interactivity;
using Avalonia.Platform.Storage;
using Avalonia.Threading;
using Avalonia.VisualTree;
using Млаумчерб.Клиент.классы;

namespace Млаумчерб.Клиент.видимое;

public partial class Окне : Window
{
    public static readonly StyledProperty<string> UsernameProperty =
        AvaloniaProperty.Register<Окне, string>(nameof(Username),
            defaultBindingMode: BindingMode.TwoWay);
    public string Username
    {
        get => GetValue(UsernameProperty);
        set => SetValue(UsernameProperty, value);
    }
    
    public static readonly StyledProperty<int> MemoryLimitProperty =
        AvaloniaProperty.Register<Окне, int>(nameof(MemoryLimit),
            defaultBindingMode: BindingMode.TwoWay, defaultValue: 2048);
    public int MemoryLimit
    {
        get => GetValue(MemoryLimitProperty);
        set => SetValue(MemoryLimitProperty, value);
    }

    public static readonly StyledProperty<bool> FullscreenProperty =
        AvaloniaProperty.Register<Окне, bool>(nameof(Fullscreen),
            defaultBindingMode: BindingMode.TwoWay, defaultValue: false);
    public bool Fullscreen
    {
        get => GetValue(FullscreenProperty);
        set => SetValue(FullscreenProperty, value);
    }
    
    public static readonly StyledProperty<bool> CheckGameFilesProperty =
        AvaloniaProperty.Register<Окне, bool>(nameof(CheckGameFiles),
            defaultBindingMode: BindingMode.TwoWay, defaultValue: false);
    public bool CheckGameFiles
    {
        get => GetValue(CheckGameFilesProperty);
        set => SetValue(CheckGameFilesProperty, value);
    }
    
    public Окне()
    {
        InitializeComponent();
    }
    
    protected override async void OnLoaded(RoutedEventArgs e)
    {
        try
        {
            Приложение.Логгер.OnLogMessage += (context, severity, message, format) =>
            {
                StringBuilder b = new();
                b.Append(DateTime.Now.ToString("[HH:mm:ss]["));
                b.Append(severity);
                b.Append("]: ");
                b.Append(message);
                b.Append('\n');
                double offsetFromBottom = LogScrollViewer.Extent.Height 
                                          - LogScrollViewer.Offset.Y 
                                          - LogScrollViewer.Viewport.Height;
                bool is_scrolled_to_end = offsetFromBottom < 20.0; // scrolled less then one line up 
                LogTextBox.Text += b.ToString();
                if(is_scrolled_to_end)
                    LogScrollViewer.ScrollToEnd();
            };
            
            Username = Приложение.Настройки.имя_пользователя;
            MemoryLimit = Приложение.Настройки.выделенная_память_мб;
            Fullscreen = Приложение.Настройки.открывать_на_весь_экран;
            
            Directory.Create(Пути.GetVersionDescriptorDir());
            VersionComboBox.SelectedIndex = 0;
            VersionComboBox.IsEnabled = false;
            var versions = await GameVersionDescriptor.GetAllVersionsAsync();
            Dispatcher.UIThread.Invoke(() =>
            {
                foreach (var p in versions)
                {
                    VersionComboBox.Items.Add(new VersionItemView(p));
                    if (Приложение.Настройки.последняя_запущенная_версия != null && 
                        p.Name == Приложение.Настройки.последняя_запущенная_версия) 
                        VersionComboBox.SelectedIndex = VersionComboBox.Items.Count - 1;
                }
                VersionComboBox.IsEnabled = true;
            });
        }
        catch (Exception ex)
        {
            Ошибки.ПоказатьСообщение(nameof(Окне), ex);
        }
    }

    private async void Запуск(object? sender, RoutedEventArgs e)
    {
        try
        {
            var selectedVersionView = (VersionItemView?)VersionComboBox.SelectedItem;
            var selectedVersion = selectedVersionView?.Props;
            Приложение.Настройки.последняя_запущенная_версия = selectedVersion?.Name;
            Приложение.Настройки.имя_пользователя = Username;
            Приложение.Настройки.выделенная_память_мб = MemoryLimit;
            Приложение.Настройки.открывать_на_весь_экран = Fullscreen;
            Приложение.Настройки.СохранитьВФайл();
            if (selectedVersion == null) 
                return;
            
            var v = await GameVersionDescriptor.CreateFromPropsAsync(selectedVersion);
            v.BeginUpdate(CheckGameFiles);
            Dispatcher.UIThread.Invoke(() => CheckGameFiles = false);
        }
        catch (Exception ex)
        {
            Ошибки.ПоказатьСообщение(nameof(Окне), ex);
        }
    }

    private void ОткрытьПапкуЛаунчера(object? s, RoutedEventArgs e)
    {
        try
        {
            Launcher.LaunchDirectoryInfoAsync(new DirectoryInfo(Directory.GetCurrent().ToString()))
                .ConfigureAwait(false);
        }
        catch (Exception ex)
        {
            Ошибки.ПоказатьСообщение(nameof(Окне), ex);
        }
    }
    
    private void ОткрытьФайлЛогов(object? sender, RoutedEventArgs e)
    {
        try
        {
            Launcher.LaunchFileInfoAsync(new FileInfo(Приложение.Логгер.LogfileName.ToString()))
                .ConfigureAwait(false);
        }
        catch (Exception ex)
        {
            Ошибки.ПоказатьСообщение(nameof(Окне), ex);
        }
    }

    private void ОткрытьРепозиторий(object? sender, RoutedEventArgs e)
    {
        try
        {
            Launcher.LaunchUriAsync(new Uri("https://timerix.ddns.net:3322/Timerix/mlaumcherb"))
                .ConfigureAwait(false);
        }
        catch (Exception ex)
        {
            Ошибки.ПоказатьСообщение(nameof(Окне), ex);
        }
    }
}