using Admin.Core.IService;
using Admin.Core.Model.Model_New;
using Admin.Core.Service;
using Aucma.Core.OldBoxFoam.Business;
using Aucma.Core.OldBoxFoam.Models;
using Aucma.Core.OldBoxFoam.Views;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using CommunityToolkit.Mvvm.Messaging;
using LiveCharts.Wpf;
using LiveCharts;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Timers;
using System.Windows;
using Admin.Core.Model;
using NPOI.SS.Formula.Functions;
using System.Windows.Documents;
using static Npgsql.Replication.PgOutput.Messages.RelationMessage;
using System.Windows.Media;
using log4net;
using System.Windows.Forms;
using Aucma.Core.HwPLc;
using Aucma.Core.PLc;
using System.Windows.Input;

namespace Aucma.Core.OldBoxFoam.ViewModels
{
    /**
     * 发泡计划
     * 
     * */
    public partial class RealRoadPageViewModel : ObservableObject
    {
        private readonly log4net.ILog log = LogManager.GetLogger(typeof(RealRoadPageViewModel));
        protected readonly IBoxFoamPlanServices? _boxFoamPlanServices;
        private IOldBoxFoamTypeServices? _oldBoxFoamTypeServices;
        private IBoxFoamDataServices? _boxFoamDataServices;
        System.Timers.Timer timer2 = new System.Timers.Timer(3000);

        public RealRoadPageViewModel()
        {
            YAxisLabelFormatter = value => Math.Round(value, 2).ToString(); 

            _boxFoamPlanServices = App.ServiceProvider.GetService<IBoxFoamPlanServices>();
            _oldBoxFoamTypeServices = App.ServiceProvider.GetService<IOldBoxFoamTypeServices>();
            _boxFoamDataServices = App.ServiceProvider.GetService<IBoxFoamDataServices>();
            //InitData();
            Collection.RefreshSpaceEvent += InitData;

        }

        #region 参数定义
        private Func<double, string> _yAxisLabelFormatter;
        public Func<double, string> YAxisLabelFormatter
        {
            get { return _yAxisLabelFormatter; }
            set
            {
                _yAxisLabelFormatter = value;
                OnPropertyChanged(nameof(YAxisLabelFormatter));
            }
        }

        /// <summary>
        /// 小时产量统计图表
        /// </summary>
        private SeriesCollection _hourAchievement = new SeriesCollection();

        public SeriesCollection HourAchievement
        {
            get { return _hourAchievement; }
            set
            {
                _hourAchievement = value;
                OnPropertyChanged(nameof(HourAchievement));
            }
        }
        /// <summary>
        /// 小时产量统计图表X轴
        /// </summary>
        private List<string> _hourOutPutList;

        public List<string> HourOutPutList
        {
            get { return _hourOutPutList; }
            set
            {
                _hourOutPutList = value;
                OnPropertyChanged(nameof(HourOutPutList));
            }
        }

        /// <summary>
        /// 型号统计图表
        /// </summary>
        private SeriesCollection _materialTypeAchievement = new SeriesCollection();
        public SeriesCollection MaterialTypeAchievement
        {
            get { return _materialTypeAchievement; }
            set
            {
                _materialTypeAchievement = value;
                OnPropertyChanged(nameof(MaterialTypeAchievement));
            }
        }
        private List<string> _materialTypeOutPutList;

        public List<string> MaterialTypeOutPutList
        {
            get { return _materialTypeOutPutList; }
            set
            {
                _materialTypeOutPutList = value;
                OnPropertyChanged(nameof(MaterialTypeOutPutList));
            }
        }
        #endregion

        #region 原货道信息刷新 Delete By wenjy 2024-01-13
        //public async void InitData(object? sender, ElapsedEventArgs e)
        //{
        //    List<OldBoxFoamType> list = await _oldBoxFoamTypeServices.QueryAsync();

        //    if(list != null)
        //    {
        //        if(list.Count > 0)
        //        {
        //            list = list.OrderBy(x=>x.ObjId).ToList();
        //            int totalItems = list.Count;
        //            int half = totalItems / 2;

        //            List<OldBoxFoamType> spaceInfoLeft = list.Take(half).ToList();
        //            List<OldBoxFoamType> spaceInfoRight = list.Skip(half).ToList();


        //            System.Windows.Application.Current.Dispatcher.Invoke((Action)(() =>
        //            {
        //                ListItems.Clear();
        //                if (spaceInfoLeft == null) return;
        //                for (int i = 0; i < spaceInfoLeft.Count; i++)
        //                {
        //                    if (i != 1)
        //                    {
        //                        spaceInfoLeft[i].Local = "";
        //                    }

        //                    ListItems.Add(new OldBoxFoamTypeModel()
        //                    {
        //                        SpaceName = $"{i + 1}#货道",
        //                        Local = spaceInfoLeft[i].Local,
        //                        Status = spaceInfoLeft[i].Storeamount == 3 ? "1" : "0",
        //                        Storeamount = spaceInfoLeft[i].Storeamount > 3 ? 0 : spaceInfoLeft[i].Storeamount,
        //                        MaterialCode = spaceInfoLeft[i].MaterialCode,
        //                        MaterialName = spaceInfoLeft[i].MaterialName,
        //                        Boxtype = spaceInfoLeft[i].Boxtype,

        //                    });
        //                }
        //                if (spaceInfoRight == null) return;
        //                for (int i = 0; i < spaceInfoRight.Count; i++)
        //                {
        //                    if (i != 1)
        //                    {
        //                        spaceInfoRight[i].Local = "";
        //                    }
        //                    ListItems.Add(new OldBoxFoamTypeModel()
        //                    {
        //                        SpaceName = $"{i + 1}#货道",
        //                        Local = spaceInfoRight[i].Local,
        //                        Status = spaceInfoRight[i].Storeamount == 3 ? "1" : "0",
        //                        Storeamount = spaceInfoRight[i].Storeamount > 3 ? 0 : spaceInfoRight[i].Storeamount,
        //                        MaterialCode = spaceInfoRight[i].MaterialCode,
        //                        MaterialName = spaceInfoRight[i].MaterialName,
        //                        Boxtype = spaceInfoRight[i].Boxtype,
        //                    });
        //                }
        //            }));
        //        }
        //    }


        //}
        #endregion

        #region 初始化datagrid
        private ObservableCollection<OldBoxFoamTypeModel> listItems = new ObservableCollection<OldBoxFoamTypeModel>();
        public ObservableCollection<OldBoxFoamTypeModel> ListItems
        {
            get { return listItems; }
            set
            {
                listItems = value;
                OnPropertyChanged();//属性通知
            }
        }
        #endregion


        /// <summary>
        /// 更新货道信息
        /// </summary>
        /// <param name="spaceDetailModel"></param>
        public async void InitData(List<SpaceDetailModel> spaceDetailModel, List<FixtureStatus> fixtureStatus)
        {
            if (spaceDetailModel == null) return;
            var spaceList = _oldBoxFoamTypeServices.QueryAsync().Result;
            List<OldBoxFoamType> storeList = new List<OldBoxFoamType>();
            foreach (var item in spaceDetailModel)
            {
                var space = spaceList.FirstOrDefault(x=>x.ObjId == item.ObjId);
                if(spaceList != null)
                {
                    if(spaceDetailModel.Count > 0)
                    {
                      
                        var spaceInfo = space;
                        spaceInfo.Storeamount = item.StoreAmount;
                        spaceInfo.Boxtype = item.StoreType;
                        storeList.Add(spaceInfo);
                        //_oldBoxFoamTypeServices.UpdateAsync(spaceInfo);
                    }
                }
            }
            if (storeList!=null&&storeList.Count>0)
            {
               await _oldBoxFoamTypeServices.UpdateAsync(storeList);
            }
            RefreshSpaceInfoDataGrid(spaceDetailModel, fixtureStatus);
            RefreshHourOutPutChart();
            RefreshMaterialTypeChart();
        }


        private void RefreshSpaceInfoDataGrid(List<SpaceDetailModel> spaceDetailModel, List<FixtureStatus> fixtureStatus)
        {
            try
            {
                if (spaceDetailModel != null)
                {
                    if (spaceDetailModel.Count > 0)
                    {
                        spaceDetailModel = spaceDetailModel.OrderBy(x => x.ObjId).ToList();
                        int totalItems = spaceDetailModel.Count;
                        int half = totalItems / 2;

                        List<SpaceDetailModel> spaceInfoLeft = spaceDetailModel.Take(half).ToList();
                        List<SpaceDetailModel> spaceInfoRight = spaceDetailModel.Skip(half).ToList();
                        List<OldBoxFoamType> list = _oldBoxFoamTypeServices.QueryAsync().Result;

                        System.Windows.Application.Current.Dispatcher.Invoke((Action)(() =>
                        {
                            ListItems.Clear();
                            if (spaceInfoLeft == null) return;
                            for (int i = 0; i < spaceInfoLeft.Count; i++)
                            {
                                var spaceInfo = list.Where(x => x.ObjId == spaceInfoLeft[i].ObjId).ToList().First();
                                if (i != 1)
                                {
                                    spaceInfo.Local = "";
                                }

                                var boxType = spaceInfo.Boxtype;
                                int fixtureAmount = fixtureStatus.Where(x => x.FixtureBoxType == boxType && x.Status != 3 && x.Status != 0).ToList().Count();


                                ListItems.Add(new OldBoxFoamTypeModel()
                                {
                                    ObjId = spaceInfoLeft[i].ObjId,
                                    SpaceName = $"{i + 1}#货道",
                                    Local = spaceInfo.Local,
                                    Status = spaceInfoLeft[i].StoreAmount == 3 ? "1" : "0",
                                    Storeamount = spaceInfoLeft[i].StoreAmount > 3 ? 0 : spaceInfoLeft[i].StoreAmount,
                                    MaterialCode = spaceInfo.MaterialCode,
                                    MaterialName = spaceInfo.MaterialName,
                                    Boxtype = spaceInfoLeft[i].StoreType,
                                    QualityResult = fixtureAmount,

                                });
                            }
                            if (spaceInfoRight == null) return;
                            for (int i = 0; i < spaceInfoRight.Count; i++)
                            {
                                var spaceInfo = list.Where(x => x.ObjId == spaceInfoRight[i].ObjId).ToList().First();
                                if (i != 1)
                                {
                                    spaceInfo.Local = "";
                                }

                                var boxType = spaceInfo.Boxtype;
                                int fixtureAmount = fixtureStatus.Where(x => x.FixtureBoxType == boxType && x.Status != 3 && x.Status != 0).ToList().Count();


                                ListItems.Add(new OldBoxFoamTypeModel()
                                {
                                    ObjId = spaceInfoRight[i].ObjId,
                                    SpaceName = $"{i + 1}#货道",
                                    Local = spaceInfo.Local,
                                    Status = spaceInfoRight[i].StoreAmount == 3 ? "1" : "0",
                                    Storeamount = spaceInfoRight[i].StoreAmount > 3 ? 0 : spaceInfoRight[i].StoreAmount,
                                    MaterialCode = spaceInfo.MaterialCode,
                                    MaterialName = spaceInfo.MaterialName,
                                    Boxtype = spaceInfoRight[i].StoreType,
                                    QualityResult = fixtureAmount,

                                });
                            }
                        }));
                    }
                }
            }catch(Exception ex)
            {
                log.Error($"货道信息列表刷新异常:{ex.Message}");
            }
        }

        /// <summary>
        /// 小时统计图表
        /// </summary>
        private void RefreshHourOutPutChart()
        {
            try
            {
                ChartValues<double> hourAchievement = new ChartValues<double>();
                HourOutPutList = new List<string>();
                App.Current.Dispatcher.BeginInvoke((Action)(() =>
                {

                    DateTime now = DateTime.Now;

                    // 判断当前是否是白班时间段
                    if (now.Hour >= 8 && now.Hour < 20)
                    {
                        HourOutPutList = new List<string>() { "8:00", "9:00", "10:00", "11:00", "12:00", "13:00", "14:00", "15:00", "16:00", "17:00", "18:00", "19:00" };
                    }
                    else
                    {
                        HourOutPutList = new List<string>() { "20:00", "21:00", "22:00", "23:00", "00:00", "01:00", "02:00", "03:00", "04:00", "05:00", "06:00", "0:007" };
                    }

                    var hourFoamDataList = _boxFoamDataServices.Query(x => x.ProductLineCode == "CX_01" && x.StationCode == "1105");

                    List<int> hours = new List<int>();

                    if (hourFoamDataList != null)
                    {

                        hourAchievement.Add(hourFoamDataList.Sum(x => x.AnHour));
                        hourAchievement.Add(hourFoamDataList.Sum(x => x.TwoHour));
                        hourAchievement.Add(hourFoamDataList.Sum(x => x.ThreeHour));
                        hourAchievement.Add(hourFoamDataList.Sum(x => x.FourHour));
                        hourAchievement.Add(hourFoamDataList.Sum(x => x.FiveHour));
                        hourAchievement.Add(hourFoamDataList.Sum(x => x.SixHour));
                        hourAchievement.Add(hourFoamDataList.Sum(x => x.SevenHour));
                        hourAchievement.Add(hourFoamDataList.Sum(x => x.EightHour));
                        hourAchievement.Add(hourFoamDataList.Sum(x => x.NineHour));
                        hourAchievement.Add(hourFoamDataList.Sum(x => x.TenHour));
                        hourAchievement.Add(hourFoamDataList.Sum(x => x.ElevenHour));
                        hourAchievement.Add(hourFoamDataList.Sum(x => x.TwelveHour));
                    }



                    var shellColumn = new ColumnSeries();
                    shellColumn.DataLabels = true;
                    shellColumn.Title = "小时产量";
                    shellColumn.Values = hourAchievement;
                    shellColumn.Foreground = Brushes.White;


                    if (HourAchievement.Count > 0)
                    {
                        for (int i = 0; i < hourAchievement.Count; i++)
                        {
                            //hours
                            HourAchievement.FirstOrDefault().Values[i] = hourAchievement.ElementAt(i);
                        }
                    }
                    else
                    {
                        HourAchievement.Add(shellColumn);
                    }
                }));
            }catch(Exception ex)
            {
                log.Error($"小时统计图表刷新异常:{ex.Message}");
            }

        }

        /// <summary>
        /// 型号统计图表
        /// </summary>
        private void RefreshMaterialTypeChart()
        {
            try
            {
                ChartValues<double> materialTypeAchievement = new ChartValues<double>();
                MaterialTypeOutPutList = new List<string>();
                App.Current.Dispatcher.BeginInvoke((Action)(() =>
                {

                    DateTime now = DateTime.Now;

                    var hourFoamDataList = _boxFoamDataServices.Query(x => x.ProductLineCode == "CX_01" && x.StationCode == "1105");

                    if (hourFoamDataList != null)
                    {
                        var grouped = hourFoamDataList.GroupBy(x => x.Fixtureboxtype);
                        foreach (var item in grouped)
                        {
                            var flattenedList = item.SelectMany(p => new[] { p.AnHour, p.TwoHour, p.ThreeHour, p.FourHour, p.FiveHour, p.SixHour, p.SevenHour, p.EightHour, p.NineHour, p.TenHour, p.ElevenHour, p.TwelveHour }).ToList();

                            MaterialTypeOutPutList.Add(item.Key);
                            materialTypeAchievement.Add(flattenedList.Sum());
                        }
                    }
                    var shellColumn = new ColumnSeries();
                    shellColumn.DataLabels = true;
                    shellColumn.Title = "型号统计";
                    shellColumn.Values = materialTypeAchievement;
                    shellColumn.Foreground = Brushes.White;
                    if (MaterialTypeAchievement.Count > 0)
                    {
                        for (int i = 0; i < materialTypeAchievement.Count; i++)
                        {
                            MaterialTypeAchievement.FirstOrDefault().Values[i] = materialTypeAchievement.ElementAt(i);
                        }
                    }
                    else
                    {
                        MaterialTypeAchievement.Add(shellColumn);
                    }
                }));
            }catch(Exception ex)
            {
                log.Error($"型号统计图表刷新异常:{ex.Message}");
            }

        }

        private OldBoxFoamTypeModel selectedDataItem;
        public OldBoxFoamTypeModel SelectedDataItem
        {
            get => selectedDataItem;
            set => SetProperty(ref selectedDataItem, value);
        }

        /// <summary>
        /// 设置夹具箱型
        /// </summary>
        /// <param name="obj"></param>
        public void BoxTypeClick(object obj)
        {
            var info = SelectedDataItem as OldBoxFoamTypeModel;
            if (info != null)
            {
                SetBoxTypeView setBoxTypeView = new SetBoxTypeView(info.Boxtype);
                setBoxTypeView.ShowDialog();
                
                if(setBoxTypeView.boxTypeResult != info.Boxtype)
                {
                    if (!string.IsNullOrEmpty(setBoxTypeView.boxTypeResult))
                    {
                        HwPLc.PlcModel plc = null;
                        //下发给PLC
                        var address = GetSpaceBoxTypeAddress(Convert.ToInt32(info.ObjId));
                        if (info.ObjId <= 4)
                        {
                            plc = HwPLc.PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("OldMelsecPlc1"));
                        }
                        else
                        {
                            plc = HwPLc.PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("OldMelsecPlc3"));
                        }
                        if(plc != null)
                        {
                            bool isFlag = plc.plc.WriteInt16(address, setBoxTypeView.boxTypeResult);

                            if (isFlag)
                            {
                                System.Windows.MessageBox.Show("货道型号设置成功");
                            }
                            else
                            {
                                System.Windows.MessageBox.Show("货道型号设置失败");
                            }
                        }
                    }
                }
            }

        }

        private string GetSpaceBoxTypeAddress(int spaceCode)
        {
            string address = string.Empty;
            switch(spaceCode)
            {
                case 1:
                    address = "D2010";
                    break;
                case 2:
                    address = "D2020";
                    break;
                case 3:
                    address = "D2030";
                    break;
                case 4:
                    address = "D2040";
                    break;
                case 5:
                    address = "D2010";
                    break;
                case 6:
                    address = "D2020";
                    break;
                case 7:
                    address = "D2030";
                    break;
                case 8:
                    address = "D2040";
                    break;
            }

            return address;
        }

        /// <summary>
        /// 设置夹具箱型
        /// </summary>
        /// <param name="obj"></param>
        public void MaterialCodeClick(object obj)
        {
            var info = SelectedDataItem as OldBoxFoamTypeModel;
            if (info != null)
            {
                //SelectType selectType = new SelectType(info.ObjId.ToString(),info.Boxtype);
                //selectType.ShowDialog();

                SplitPlanView splitPlanView = new SplitPlanView("1", 1, info.Boxtype,info.ObjId.ToString());
                splitPlanView.ShowDialog();
            }

        }
    }
}