using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Threading;

namespace HashCalculator.GUI
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        internal ViewModel ViewModel => (ViewModel)DataContext;
        private bool _autoscroll = true;

        public MainWindow()
        {
            InitializeComponent();
            Translator.ProviderChanged += (s, e) => Dispatcher.Invoke(() =>
            {
                ViewModel.NotifyCsfChange();
            });
            ViewModel.OpenFileDialog += ViewModel_OpenFileDialog;
            ViewModel.ClearTracer += ViewModel_ClearTracer;
        }

        private void ViewModel_OpenFileDialog(object? sender, OpenFileDialogEventArgs e)
        {
            var sdkRoot = new OpenFileDialog
            {
                Title = e.Title,
                Filter = string.Join('|', e.Filters.Select(t =>
                {
                    if (t.Description is null)
                    {
                        return $"{t.Extension}|{t.Extension}";
                    }
                    return $"{t.Description} ({t.Extension})|{t.Extension}";
                }))
            };
            e.Result = Dispatcher.InvokeAsync(() => sdkRoot.ShowDialog(this) is not true ? null : sdkRoot.FileName).Task;
        }

        private void OnButtomScrollViewerScrollChanged(object sender, ScrollChangedEventArgs e)
        {
            var scrollViewer = (ScrollViewer)sender;
            // User scroll event : set or unset auto-scroll mode
            if (e.ExtentHeightChange == 0)
            {   // Content unchanged : user scroll event
                if (scrollViewer.VerticalOffset == scrollViewer.ScrollableHeight)
                {   // Scroll bar is in bottom
                    // Set auto-scroll mode
                    _autoscroll = true;
                }
                else
                {   // Scroll bar isn't in bottom
                    // Unset auto-scroll mode
                    _autoscroll = false;
                }
            }

            // Content scroll event : auto-scroll eventually
            if (_autoscroll && e.ExtentHeightChange != 0)
            {   // Content changed and auto-scroll mode set
                // Autoscroll
                scrollViewer.ScrollToVerticalOffset(scrollViewer.ExtentHeight);
            }
        }

        private void OnInitialized(object sender, EventArgs e)
        {
            TracerListener.DataAvailaible += delegate
            {
                Dispatcher.InvokeAsync(() =>
                {
                    if (TracerListener.GetText() is not { Length: > 0 } text)
                    {
                        return;
                    }
                    LogPrefix.Visibility = Visibility.Visible;
                    LogText.AppendText(text);
                    ClearLogs.Visibility = Visibility.Visible;
                });
            };
        }

        private void ViewModel_ClearTracer(object? sender, EventArgs e)
        {
            LogPrefix.Visibility = Visibility.Collapsed;
            LogText.Clear();
            ClearLogs.Visibility = Visibility.Collapsed;
        }
    }
}