using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace InABox.DynamicGrid;

/// <summary>
/// Interaction logic for VerticalDynamicEditorGridLayout.xaml
/// </summary>
public partial class VerticalDynamicEditorGridLayout : DynamicEditorGridLayout
{
    
    public override bool TabStripVisible
    {
        get { return Editors.TabStripVisible; }
        set { Editors.TabStripVisible = value; }
    }

    private double _totalWidth;
    public override double TotalWidth => _totalWidth;

    private double _editorHeight;
    private double _pageHeight;
    public override double TotalHeight => _editorHeight + _pageHeight;

    public VerticalDynamicEditorGridLayout()
    {
        InitializeComponent();
    }

    public override void LoadPages(IEnumerable<IDynamicEditorPage> pages)
    {
        Editors.Items.Clear();
        OtherPages.Items.Clear();
        foreach (var page in pages.OrderBy(x => x.PageType).ThenBy(x => x.Order).ThenBy(x => x.Caption()))
        {
            var tab = new DynamicTabItem();
            tab.Header = page.Caption();
            if (page is FrameworkElement element)
                element.Margin = new Thickness(0, 2, 0, 0);
            tab.Content = page;

            var minSize = page.MinimumSize();

            if(page is DynamicEditorGrid.DynamicEditPage)
            {
                Editors.Items.Add(tab);
                _editorHeight = Math.Max(_editorHeight, minSize.Height);
                _totalWidth = Math.Max(_totalWidth, minSize.Width);
            }
            else
            {
                OtherPages.Items.Add(tab);
                _pageHeight = Math.Max(_pageHeight, minSize.Height);
            }

        }

        Editors.SelectedIndex = 0;
    }

    private bool bChanging;
    private void Editors_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (bChanging) return;
        if ((e.OriginalSource != Editors && e.OriginalSource != OtherPages) || e.OriginalSource is not DynamicTabControl tabControl) return;
        if (tabControl.SelectedItem is not DynamicTabItem tab) return;

        bChanging = true;
        try
        {
            if (tab is not null && tab.Content is IDynamicEditorPage page)
            {
                SelectPage(page);
            }
        }
        finally
        {
            bChanging = false;
        }
    }

    private void Grid_SizeChanged(object sender, SizeChangedEventArgs e)
    {
        EditorRow.MaxHeight = e.NewSize.Height - 50;
    }
}
