using NEIntelligentControl2.Models.Windturbine;
using NEIntelligentControl2.Views.Basic;
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 NEIntelligentControl2.Views.Infos
{
    /// <summary>
    /// 状态信息
    /// </summary>
    public partial class StateInfo : UserControl
    {
        public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register("ItemsSource", typeof(List<StatusTimeInfo>), typeof(StateInfo), new PropertyMetadata(ItemsSourceChanged));
        public static readonly DependencyProperty ItemsTitleProperty = DependencyProperty.Register("ItemsTitle", typeof(string), typeof(StateInfo), new PropertyMetadata(ItemsTitleChanged));


        /// <summary>
        /// 内容集合
        /// </summary>
        public List<StatusTimeInfo> ItemsSource { get => GetValue(ItemsSourceProperty) as List<StatusTimeInfo>; set => SetValue(ItemsSourceProperty, value); }
        public string ItemsTitle { get => GetValue(ItemsTitleProperty) as string; set => SetValue(ItemsTitleProperty, value); }
        /// <summary>
        /// 框选开始坐标
        /// </summary>
        private Point _StartPoint;
        /// <summary>
        /// 选择的时间
        /// </summary>
        private double _SelectedTime = 0;
        private bool _IsWidth;
        public StateInfo()
        {
            InitializeComponent();
        }

        private static void ItemsSourceChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            var si = d as StateInfo;
            if (si == null) return;

            si.SetStateValue();
        }

        private static void ItemsTitleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            var si = d as StateInfo;
            if (si == null) return;

            if (!string.IsNullOrWhiteSpace(e.NewValue as string))
            {
                si._tbtitle.Visibility = Visibility.Visible;
            }
            si._tbtitle.Text = e.NewValue as string;
        }

        /// <summary>
        /// 设置数值
        /// </summary>
        private void SetStateValue()
        {
            _SelectedTime = 0;
            _tb.Text = Math.Round(_SelectedTime, 2).ToString();

            _sp.Children.Clear();
            _IsWidth = this.ActualWidth == 0;
            double width = _IsWidth ? this.Width - 70 : _sp.ActualWidth;
            Console.WriteLine(width);
            var itemsSource = this.ItemsSource;
            if (itemsSource == null) return;
            double totalTime = itemsSource.Sum(i => i.Duration);
            foreach (var v in itemsSource)
            {
                StateInfoPoint sip = new StateInfoPoint(v) { TotalWidth = width, TotalTime = totalTime, SelectionChanged = ItemSelectionChanged };
                _sp.Children.Add(sip);
            }
        }

        private void ItemSelectionChanged(bool arg1, double arg2)
        {
            _SelectedTime = arg1 ? _SelectedTime + arg2 : _SelectedTime - arg2;

            _tb.Text = Math.Round(_SelectedTime, 2).ToString();
        }

        private void Grid_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            _StartPoint = e.GetPosition(sender as Grid);
        }

        private void Grid_MouseMove(object sender, MouseEventArgs e)
        {
            if (e.LeftButton != MouseButtonState.Pressed) return;
            var ct2 = sender as Grid;
            var ponit = e.GetPosition(ct2);


            if (_RTMain.Visibility != Visibility.Visible)
            {
                _RTMain.Visibility = Visibility.Visible;
            }

            Point p1 = new Point();
            p1.X = Math.Min(_StartPoint.X, ponit.X);
            p1.Y = Math.Min(_StartPoint.Y, ponit.Y);

            Point p2 = new Point();
            p2.X = Math.Max(_StartPoint.X, ponit.X);
            p2.Y = Math.Max(_StartPoint.Y, ponit.Y);


            _RTMain.Margin = new Thickness(p1.X, p1.Y, ct2.ActualWidth - p2.X, ct2.ActualHeight - p2.Y);


            if (_IsWidth)
            {
                p1.X -= 70;
                p2.X -= 70;
            }

            double d = 0;
            foreach (var v in _sp.Children)
            {
                var ct = v as StateInfoPoint;

                var left = ct.TranslatePoint(default(Point), _sp).X;

                var right = left + ct.ActualWidth;

                var b = right >= p1.X && left <= p2.X;

                if (Keyboard.Modifiers == ModifierKeys.Control)
                {
                    if (b) ct.IsSelected = true;
                }
                else
                {
                    ct.IsSelected = b;
                }
                if (ct.IsSelected)
                {
                    d += ct.Time;
                }
            }
            _SelectedTime = d;
            _tb.Text = Math.Round(d, 2).ToString();
        }

        private void Grid_MouseLeave(object sender, MouseEventArgs e)
        {
            _RTMain.Visibility = Visibility.Hidden;
        }

        private void Grid_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            _RTMain.Visibility = Visibility.Hidden;
        }
    }
}
