using Microsoft.UI.Xaml.Controls.Primitives;
using System;

namespace Sonex.Client.Controls.DataGridView
{
    // Odpowiedzialnosc pliku: przeliczenia scrolla pionowego/poziomego i pozycjonowanie kolumn.
    public sealed partial class DataGridView
    {
        bool _NeedCalcHorizontalScroll = true;
        bool _NeedCalcVerticalScroll = true;
        double _HorizontalScrollOffset = 0;
        int _TopRowIndex = 0;
        int _MaxIndexOnScreen = 0;

        private void CalcHorizontalScroll()
        {
            // Przeliczenie pozycji "na ekranie" dla każdej kolumny po zmianie scrolla/układu.
            if (_NeedCalcHorizontalScroll == false) return;

            var newValue = Math.Max(0, _TotalColWidth - _Canvas.ActualWidth + _IndexColWidth);
            foreach (var column in _Columns)
            {
                if (column.IsHiden)
                { continue; }
                if (column.IsPinned)
                    column.LeftOnScreen = column.Left;
                else
                    column.LeftOnScreen = column.Left - _HorizontalScrollOffset;
            }

            foreach (Column column in _Columns)
            {
                if (column.IsHiden)
                {
                    column.IsOnScreen = false;
                    continue;
                }
                if (column.IsPinned)
                {
                    column.IsOnScreen = (column.LeftOnScreen < ActualWidth) && (column.LeftOnScreen + column.Width > _IndexColWidth);
                }
                else
                {
                    column.IsOnScreen = (column.LeftOnScreen < ActualWidth) && ((column.LeftOnScreen + column.Width) > (_IndexColWidth + _PinedColWidth));
                }
            }

            newValue += 200;
            if (_ScrollHorizontal.Maximum != newValue)
            {
                if (ColumnResizing == null)
                {
                    _ScrollHorizontal.Maximum = newValue;
                }
                else if (ColumnResizing != null && _ScrollHorizontal.Maximum < newValue)
                {
                    var v = _ScrollHorizontal.Value;
                    _ScrollHorizontal.Maximum = newValue;
                    _ScrollHorizontal.Value = v;
                }

            }

            _NeedCalcHorizontalScroll = false;
        }
        private void _ScrollHorizontal_ValueChanged(object sender, RangeBaseValueChangedEventArgs e)
        {
            // Aktualizacja offsetu i ewentualne dociągnięcie aktywnego zaznaczenia podczas drag-scroll.
            _HorizontalScrollOffset = e.NewValue;
            //foreach (var column in _ColumnsHeaders)
            //{
            //    if (column.IsPinned)
            //        column.LeftOnScreen = column.Left;
            //    else
            //        column.LeftOnScreen = column.Left - _HorizontalScrollOffset;
            //}
            if (MouseLeftButtonDown && _SelectRange.From != null)
                OnCellDrag(null);
            else if (_ActualArea == AreaType.Index && MouseLeftButtonDown && _IndexFrom != null && _IndexTo != null)
                OnIndexDrag(null);
            //_Canvas.Focus(Microsoft.UI.Xaml.FocusState.Pointer);
            _NeedCalcHorizontalScroll = true;
            RequestRender();
        }
        private void _ScrollVertical_ValueChanged(object sender, RangeBaseValueChangedEventArgs e)
        {
            // Scroll pionowy przesuwa "okno" danych; top row jest bazą do renderowania wierszy.
            _TopRowIndex = (int)e.NewValue;

            if (MouseLeftButtonDown && _SelectRange.From != null)
                OnCellDrag(null);
            else if (MouseLeftButtonDown && _IndexFrom != null && _IndexTo != null)
                OnIndexDrag(null);
            //_Canvas.Focus(Microsoft.UI.Xaml.FocusState.Pointer);
            RequestRender();
        }
        private void CalcVerticalScroll()
        {
            // Maksymalna liczba widocznych wierszy zależy od aktualnej wysokości nagłówka i wiersza.
            _MaxIndexOnScreen = (int)Math.Ceiling((_Canvas.ActualHeight - _HeaderHeight) / _RowsHeight);

            if (_NeedCalcVerticalScroll == false) return;
            int newValue;
            if (_ItemsSourceFiltred == null || _ItemsSourceFiltred.Count == 0)
            {
                newValue = 0;
            }
            else
            {
                newValue = Math.Max(0, _ItemsSourceFiltred.Count - _MaxIndexOnScreen + 1);
            }
            if (_ScrollVertical.Maximum != newValue)
                _ScrollVertical.Maximum = newValue;
            _NeedCalcVerticalScroll = false;

        }
    }
}
