using Aitex.Core.RT.Log;
using SciChart.Charting.ChartModifiers;
using SciChart.Charting.Visuals.Annotations;
using SciChart.Data.Model;
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 MECF.Framework.UI.Client.CenterViews.DataLogs.ProcessHistory
{
    /// 
    /// ProcessDetailView.xaml 的交互逻辑
    /// 
    public partial class ProcessDetailView : UserControl
    {
        private ProcessDetailViewModel processDetail;
        public ProcessDetailView()
        {
            InitializeComponent();          
        }
        private void OnAnnotationCreated(object sender, AnnotationCreationArgs e)
        {
            if (e.NewAnnotation is LineArrowAnnotation newAnnotation)
            {
                try
                {
                    processDetail = DataContext as ProcessDetailViewModel;  
                    if (processDetail != null)
                    {
                        double x1 = 0, y1 = 0, x2 = 0, y2 = 0, temp = 0;
                        if (newAnnotation.X1 is Double xx1) x1 = xx1;
                        if (newAnnotation.X2 is Double xx2) x2 = xx2;
                        if (newAnnotation.Y1 is Double yy1) y1 = yy1;
                        if (newAnnotation.Y2 is Double yy2) y2 = yy2;
                        if (x1 > x2) { temp = x1; x1 = x2; x2 = temp; }
                        processDetail.VisibleRangeTime = new DoubleRange()
                        {
                            Min = x1,
                            Max = x2
                        };
                        LOG.Info($"LineArrowAnnotation x1[{x1},x2[{x2}]]");
                        if (y1 > y2) { temp = y1; y1 = y2; y2 = temp; }
                        processDetail.VisibleRangeValue = new DoubleRange()
                        {
                            Min = y1,
                            Max = y2
                        };
                        LOG.Info($"LineArrowAnnotation y1[{y1},y2[{y2}]]");
                    }                   
                    if(!sciChart.Annotations.Remove(newAnnotation))
                    syncChart?.Annotations?.Remove(newAnnotation);
                    ZoomByLine.IsChecked = false;
                }
                catch(Exception ex)
                {
                    LOG.Info($"LineArrowAnnotation:{ex.StackTrace}-{ex.Message}");
                }
            } 
        }
        private void RadioButton_Checked(object sender, RoutedEventArgs e)
        {
            if(sender is RadioButton radio)
            {
                switch (radio.Name)
                {
                    case "ShowVerticalLine":
                        if (sliceModifier.VerticalLines == null || sliceModifier.VerticalLines.Count == 0)
                        {
                            sliceModifier.VerticalLines.Add(new VerticalLineAnnotation() { X1 = 0 });
                            sciChart.MouseLeftButtonUp += sciChart_MouseLeftButtonUp;
                        }
                        break;
                    case "DeleteVertical":
                        sliceModifier.VerticalLines.Clear();
                        break;
                }
            }          
           e.Handled = true;
        }  
        private void ShowVetical_UnChecked(object sender, RoutedEventArgs e)
        {
            HoldVetical.IsChecked = false;
            sciChart.MouseLeftButtonUp -= sciChart_MouseLeftButtonUp;
            e.Handled = true;
        }
        private void SelectSeries_Unchecked(object sender, RoutedEventArgs e)
        {
            foreach (var item in sciChart.RenderableSeries)
            {
                if(item.IsSelected)
                item.IsSelected = false;
            }
            foreach (var item in syncChart.RenderableSeries)
            {
                if (item.IsSelected)
                    item.IsSelected = false;
            }
            e.Handled = true;
        }
        private void sciChart_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            if (ShowVerticalLine.IsChecked == true && HoldVetical.IsChecked == false)
            {
                var vertical = sliceModifier.VerticalLines?.FirstOrDefault();
                if (vertical != null) vertical.X1 = rolloverModifier.SeriesData.SeriesInfo.FirstOrDefault().XValue;
            }
            e.Handled = true;
        }
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            if (sender is Button btn)
            {
                if (btn.Name == "MoveToLower")
                {   
                     var series=sciChart.SelectedRenderableSeries.FirstOrDefault();
                    if (series == null) return;                    
                    sciChart.RenderableSeries.Remove(series);                   
                    syncChart.RenderableSeries.Add(series);
                    if (syncChart.Visibility != Visibility.Visible)
                    {
                        Grid.SetRowSpan(sciChart, 1);
                        syncChart.Visibility = Visibility.Visible; 
                    }
                }
                else if (btn.Name == "MoverToUpper")
                {
                    var series = syncChart.SelectedRenderableSeries.FirstOrDefault();
                    if (series == null) return;
                    syncChart.RenderableSeries.Remove(series);
                    sciChart.RenderableSeries.Add(series);
                    if (syncChart.RenderableSeries == null || syncChart.RenderableSeries.Count == 0)
                    {
                        syncChart.Visibility = Visibility.Hidden;
                        Grid.SetRowSpan(sciChart, 2);
                    }
                }
            }
        }      
    }
}