using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
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;
using System.Net;
using FLY.Thick.Base.Common;
using System.Windows.Threading;
using FLY.Thick.Base.Client;
using Unity;
using FLY.Thick.Base.IService;
using System.ComponentModel;
using GalaSoft.MvvmLight.Command;

namespace FLY.Thick.Base.UI
{
    /// <summary>
    /// Page_Curve.xaml 的交互逻辑
    /// </summary>
    public partial class PgCurveModify : Page
    {
        PgCurveModifyVm viewModel;

        public PgCurveModify()
        {
            InitializeComponent();
            InitializeComponent2();
        }



        void InitializeComponent2()
        {
            System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea1 = new System.Windows.Forms.DataVisualization.Charting.ChartArea();
            System.Windows.Forms.DataVisualization.Charting.Legend legend1 = new System.Windows.Forms.DataVisualization.Charting.Legend();

            System.Windows.Forms.DataVisualization.Charting.Series series_orgad = new System.Windows.Forms.DataVisualization.Charting.Series();

            System.Windows.Forms.DataVisualization.Charting.Series series_revisead = new System.Windows.Forms.DataVisualization.Charting.Series();

            chart1.Name = "chart1";
            chart1.BackColor = System.Drawing.Color.Transparent;
            // 
            // chart1
            // 
            chartArea1.Name = "Default";
            chartArea1.AxisX.LabelStyle.Font = new System.Drawing.Font("Trebuchet MS", 8.25F, System.Drawing.FontStyle.Bold);
            chartArea1.AxisX.LineColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
            chartArea1.AxisX.MajorGrid.LineColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
            chartArea1.AxisY.LabelStyle.Font = new System.Drawing.Font("Trebuchet MS", 8.25F, System.Drawing.FontStyle.Bold);
            chartArea1.AxisY.LineColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
            chartArea1.AxisY.MajorGrid.LineColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
            chartArea1.BackColor = System.Drawing.Color.OldLace;
            //chartArea1.BackGradientStyle = System.Windows.Forms.DataVisualization.Charting.GradientStyle.TopBottom;
            //chartArea1.BackSecondaryColor = System.Drawing.Color.White;
            chartArea1.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
            chartArea1.BorderDashStyle = System.Windows.Forms.DataVisualization.Charting.ChartDashStyle.Solid;
            chartArea1.ShadowColor = System.Drawing.Color.Transparent;
            //对数坐标
            //chartArea1.AxisY.IsLogarithmic = true;
            //chartArea1.AxisY.LogarithmBase = Math.E;
            this.chart1.ChartAreas.Add(chartArea1);


            legend1.Name = "Default";
            legend1.BackColor = System.Drawing.Color.Transparent;
            legend1.Enabled = true;
            legend1.Font = new System.Drawing.Font("Trebuchet MS", 8.25F, System.Drawing.FontStyle.Bold);
            legend1.IsTextAutoFit = false;

            this.chart1.Legends.Add(legend1);
            //this.chart1.Location = new System.Drawing.Point(16, 32);

            series_orgad.Name = "series_orgad";
            series_orgad.BorderColor = System.Drawing.Color.LightSkyBlue;
            series_orgad.BorderWidth = 3;
            series_orgad.ChartArea = chartArea1.Name;
            series_orgad.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line;
            series_orgad.Color = System.Drawing.Color.Blue;
            series_orgad.Legend = legend1.Name;
            series_orgad.MarkerSize = 8;
            series_orgad.MarkerStyle = System.Windows.Forms.DataVisualization.Charting.MarkerStyle.Circle;

            series_orgad.ShadowColor = System.Drawing.Color.Black;
            series_orgad.ShadowOffset = 2;
            series_orgad.XValueType = System.Windows.Forms.DataVisualization.Charting.ChartValueType.Double;
            series_orgad.YValueType = System.Windows.Forms.DataVisualization.Charting.ChartValueType.Int32;

            series_orgad.LegendText = "原始曲线";

            this.chart1.Series.Add(series_orgad);

            series_revisead.Name = "series_revisead";
            series_revisead.BorderColor = System.Drawing.Color.LightPink;
            series_revisead.BorderWidth = 3;
            series_revisead.ChartArea = chartArea1.Name;
            series_revisead.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line;
            series_revisead.Color = System.Drawing.Color.Red;
            series_revisead.Legend = legend1.Name;
            series_revisead.MarkerSize = 8;
            series_revisead.MarkerStyle = System.Windows.Forms.DataVisualization.Charting.MarkerStyle.Circle;

            series_revisead.ShadowColor = System.Drawing.Color.Black;
            series_revisead.ShadowOffset = 2;
            series_revisead.XValueType = System.Windows.Forms.DataVisualization.Charting.ChartValueType.Double;
            series_revisead.YValueType = System.Windows.Forms.DataVisualization.Charting.ChartValueType.Int32;

            series_revisead.LegendText = "样品修正后曲线";
            this.chart1.Series.Add(series_revisead);
        }

        [InjectionMethod]
        public void Init(ICurveService curveService)
        {
            viewModel = new PgCurveModifyVm();
            viewModel.Init(curveService, chart1, this);
            this.DataContext = viewModel;
        }
    }

    public class PgCurveModifyVm : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        #region Command
        public RelayCommand ApplyCmd { get; }
        public RelayCommand ScaleCmd { get; }

        public RelayCommand SetRevisedCmd { get; }
        #endregion

        CurveCore curveCore = new CurveCore();
        ICurveService curveService;
        System.Windows.Forms.DataVisualization.Charting.Chart chart1;
        Page page;

        public PgCurveModifyVm() 
        {
            ApplyCmd = new RelayCommand(Apply);
            ScaleCmd = new RelayCommand(Scale);
            SetRevisedCmd = new RelayCommand(SetRevised);
        }

        public void Init(ICurveService curveService,
            System.Windows.Forms.DataVisualization.Charting.Chart chart1,
            Page page)
        {
            this.curveService = curveService;
            this.chart1 = chart1;
            this.page = page;

            update_curves();
            curveService.PropertyChanged += mCurveService_PropertyChanged;
        }

        void update_curves()
        {
            curveCore.Flag = curveService.Flag;
            string json = Newtonsoft.Json.JsonConvert.SerializeObject(curveService.Curves);
            curveCore.Curves = Newtonsoft.Json.JsonConvert.DeserializeObject<List<CurveCell>>(json);
            DataBindAll();
        }
        void mCurveService_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
        {
            if (e.PropertyName == "Flag")
            {
                curveCore.Flag = curveService.Flag;
                DataBindAll();
            }
            else if (e.PropertyName == "Curves")
            {
                string json = Newtonsoft.Json.JsonConvert.SerializeObject(curveService.Curves);
                curveCore.Curves = Newtonsoft.Json.JsonConvert.DeserializeObject<List<CurveCell>>(json);
                DataBindAll();
            }
        }

        #region DataBindAll

        void DataBindAll()
        {
            DataBindAll_OrgAD();
            DataBindAll_RevisedAD();
        }

        void DataBindAll_OrgAD()
        {
            var curves = curveCore.Curves;

            chart1.Series["series_orgad"].Points.Clear();

            if (curves == null)
                return;
            for (int i = 0; i < curves.Count(); i++)
            {
                int ad = curves[i].AD;
                int thick = curves[i].Value;

                chart1.Series["series_orgad"].Points.AddXY(thick / 100.0, ad);

                if ((i + 1) <= (curves.Count() - 1))
                {
                    //补齐点, 以thick=100 步进
                    int step = 100;
                    bool isDescending = true;//降序排列
                    if (curves[i].AD < curves[i + 1].AD)
                        isDescending = false;

                    while (true)
                    {
                        if (isDescending)
                        {
                            ad -= step;
                            if (ad <= curves[i + 1].AD)
                                break;
                        }
                        else
                        {
                            ad += step;
                            if (ad >= curves[i + 1].AD)
                                break;
                        }

                        thick = curveCore.AD2Value(ad, AD2ValueFlag.NoRevised);
                        chart1.Series["series_orgad"].Points.AddXY(thick / 100.0, ad);
                        chart1.Series["series_orgad"].Points.Last().MarkerStyle =
                            System.Windows.Forms.DataVisualization.Charting.MarkerStyle.None;
                    }
                }
            }
        }
        void DataBindAll_RevisedAD()
        {
            var curves = curveCore.Curves;
            chart1.Series["series_revisead"].Points.Clear();
            if (curves == null)
                return;
            for (int i = 0; i < curves.Count(); i++)
            {
                int ad = curves[i].RevisedAD;
                int thick = curves[i].Value;

                chart1.Series["series_revisead"].Points.AddXY(thick / 100.0, ad);

                if ((i + 1) <= (curves.Count() - 1))
                {
                    //补齐点, 以thick=100 步进
                    int step = 100;
                    bool isDescending = true;//降序排列
                    if (curves[i].AD < curves[i + 1].AD)
                        isDescending = false;

                    while (true)
                    {
                        if (isDescending)
                        {
                            ad -= step;
                            if (ad <= curves[i + 1].AD)
                                break;
                        }
                        else
                        {
                            ad += step;
                            if (ad >= curves[i + 1].AD)
                                break;
                        }

                        thick = curveCore.AD2Value(ad, AD2ValueFlag.Revised);
                        chart1.Series["series_revisead"].Points.AddXY(thick / 100.0, ad);
                        chart1.Series["series_revisead"].Points.Last().MarkerStyle =
                            System.Windows.Forms.DataVisualization.Charting.MarkerStyle.None;
                    }
                }
            }
        }
        #endregion

        private void Scale()
        {
            var curves = curveCore.Curves;
            if (curves.Count > 1)
            {
                WdThickScale w = new WdThickScale();
                w.Old = curves[1].Value / 100.0;
                w.New = curves[1].Value / 100.0;
                w.Owner = FLY.ControlLibrary.COMMON.GetWindow(page);
                if (w.ShowDialog() == true)
                {
                    if ((w.Old != w.New) && (w.New != 0) && (w.Old != 0))
                    {
                        double scale = (double)w.New / w.Old;
                        for (int i = 0; i < curves.Count(); i++)
                        {
                            curves[i].Value = (int)(scale * curves[i].Value);
                        }
                    }
                }
            }
            DataBindAll();
        }

        private void SetRevised()
        {
            var curves = curveCore.Curves;
            for (int i = 0; i < curves.Count(); i++)
            {
                curves[i].AD = curves[i].RevisedAD;
            }
            DataBindAll();
        }

        private void Apply()
        {
            if (!WdPassword.Authorize("Curve"))
                return;

            curveService.Curves = curveCore.Curves;
            curveService.Apply();
            FLY.ControlLibrary.Window_Tip.Show("应用成功",
                null,
                TimeSpan.FromSeconds(2));
            
        }
    }
}