using CommunityToolkit.Mvvm.ComponentModel;
using LiveCharts.Defaults;
using LiveCharts.Wpf;
using LiveCharts;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Media;
using System.Collections.ObjectModel;
using Admin.Core.IService;
using Admin.Core.Service;
using Microsoft.Extensions.DependencyInjection;
using Admin.Core.Common;
using Admin.Core.Tasks;
using Aucma.Core.BoxFoam.Business;
using System.Windows.Shapes;
using System.Timers;
using Aucma.Core.BoxFoam.Models;
using Admin.Core.Model;
using System.Threading;
using Aucma.Core.HwPLc;
using Admin.Core.Model.ViewModels;

namespace Aucma.Core.BoxFoam.ViewModels
{
    public partial class FoamMonitorPageViewModel : ObservableObject
    {
        private readonly IBaseBomInfoServices? _baseBomInfoServices;
        private readonly IBoxFoamDataServices _boxFoamDataServices;
        private readonly ICurrentTeamTimeServices _currentTeamTimeServices;
        private readonly IBoxFoamDataServices? _oldBoxFoamDataServices;
        private readonly IBoxFoamPlanServices _boxFoamPlanServices;
        private readonly ISysUserInfoServices _sysUserInfoServices;
        private readonly IBoxFoamDataRecordServices _boxFoamDataRecordServices;
        private readonly IBoxFoamDataRealTimeServices? _boxFoamDataRealTimeServices;
        private readonly IBoxFoamDataRealTimeHistoryServices _boxFoamDataRealTimeHistoryServices;
        System.Timers.Timer timer2 = new System.Timers.Timer(5000);
        
        int totalAmount = 0;

        public FoamMonitorPageViewModel()
        {
            _boxFoamPlanServices = App.ServiceProvider.GetService<IBoxFoamPlanServices>();
            _boxFoamDataRealTimeServices = App.ServiceProvider.GetService<IBoxFoamDataRealTimeServices>();
            _boxFoamDataRecordServices = App.ServiceProvider.GetService<IBoxFoamDataRecordServices>();
            _currentTeamTimeServices = App.ServiceProvider.GetService<ICurrentTeamTimeServices>();
            _boxFoamDataRealTimeHistoryServices = App.ServiceProvider.GetService<IBoxFoamDataRealTimeHistoryServices>();
            _sysUserInfoServices = App.ServiceProvider.GetService<ISysUserInfoServices>();

            _boxFoamDataServices = App.ServiceProvider.GetService<IBoxFoamDataServices>();
            _baseBomInfoServices = App.ServiceProvider.GetService<IBaseBomInfoServices>();

            CollectionFoamLine.RefreshBoxFoamDataDelegateEvent += InitData;

            //timer2.Elapsed += new System.Timers.ElapsedEventHandler(RealTimeFoamingTask);  //到达时间的时候执行事件;
            //timer2.AutoReset = true;//设置是执行一次(false)还是一直执行(true); 
            //timer2.Enabled = true;//需要调用 timer.Start()或者timer.Enabled = true来启动它,
            //timer2.Start();//timer.Start()的内部原理还是设置timer.Enabled = true

            //Task.WaitAll(InitData
            //
            Task.Run(() =>
            {
                while (true)
                {
                    Thread.Sleep(3000);
                    App.Current.Dispatcher.BeginInvoke((Action)(() =>
                    {
                        InitEveryDayMethod();
                    }));
                }
            });
        }


        #region 日产量
        /// <summary>
        /// 每日生产
        /// </summary>
        /// <returns></returns>
        private Task InitEveryDayMethod()
        {
            ProductionHourList = new List<string>();
            List<WorkTime> listTime =  _baseBomInfoServices.getWorkTime().Result;
            foreach (WorkTime time in listTime)
            {
                ProductionHourList.Add(time.hourTime);
            }

            // 货道列表
            List<BoxFoamData> list = _boxFoamDataServices.QueryAsync(x=>x.ProductLineCode.Equals("CX_02") && x.StationCode=="1005").Result;

            if(list != null)
            {
                ChartValues<double> achievement = new ChartValues<double>();
                //Achievement.Clear();
                #region 按时间统计
                if(list.Count > 0) {
                    achievement.Add(list.Sum(x => x.AnHour));
                    achievement.Add(list.Sum(x => x.TwoHour));
                    achievement.Add(list.Sum(x => x.ThreeHour));
                    achievement.Add(list.Sum(x => x.FourHour));
                    achievement.Add(list.Sum(x => x.FiveHour));
                    achievement.Add(list.Sum(x => x.SixHour));
                    achievement.Add(list.Sum(x => x.SevenHour));
                    achievement.Add(list.Sum(x => x.EightHour));
                    achievement.Add(list.Sum(x => x.NineHour));
                    achievement.Add(list.Sum(x => x.TenHour));
                    achievement.Add(list.Sum(x => x.ElevenHour));
                    achievement.Add(list.Sum(x => x.TwelveHour));
                }

                var column = new ColumnSeries();
                column.DataLabels = true;
                column.Title = "当日小时产量统计";
                column.Values = achievement;
                column.Foreground = Brushes.White;
                //  Achievement.Add(column);
                if (Achievement.Count > 0)
                {
                    for(int i = 0; i < achievement.Count; i++)
                    {
                        Achievement.FirstOrDefault().Values[i] = achievement[i];
                    }
                }
                else
                {
                    Achievement.Add(column);
                }
                #endregion



                #region 按类型统计
                MaterialNameList = new List<string>();
                ChartValues<int> achievement2 = new ChartValues<int>();
                //foreach(BoxFoamData space in list)
                //{
                //    MaterialNameList.Add(space.Fixtureboxtype);
                //}
                var grouped = list.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();

                    MaterialNameList.Add(item.Key);
                    achievement2.Add(flattenedList.Sum());
                }
             //   ModelStatistics.Clear();
                var column2 = new ColumnSeries();
                column2.DataLabels = true;
                column2.Title = "当日型号产量统计";
                column2.Values = achievement2;
                column2.Foreground = Brushes.White;
              //  ModelStatistics.Add(column2);
                if (ModelStatistics.Count > 0)
                {
                    for(int i=0;i< achievement2.Count; i++)
                    {
                        ModelStatistics.FirstOrDefault().Values[i] = achievement2[i];
                    }
                }
                else
                {
                    ModelStatistics.Add(column2);
                }

                #endregion
            }

            //await InitExecMethod();
            return Task.CompletedTask;
        }


        #endregion

        #region 日产量柱状图X轴日期
        /// <summary>
        /// 日产量柱状图X轴日期
        /// </summary>
        private List<string> productionHourList;

        public List<string> ProductionHourList
        {
            get { return productionHourList; }
            set { productionHourList = value; }
        }
        #endregion

        #region 型号统计


        #region 型号统计柱状图x轴物料类型
        /// <summary>
        /// 型号统计柱状图x轴物料类型
        /// </summary>
        private List<string> materialNameList;

        public List<string> MaterialNameList
        {
            get { return materialNameList; }
            set { materialNameList = value; }
        }
        #endregion

        #region 型号统计柱状图
        /// <summary>
        /// 型号统计柱状图
        /// </summary>
        private SeriesCollection modelStatistics = new SeriesCollection();

        public SeriesCollection ModelStatistics
        {
            get { return modelStatistics; }
            set { modelStatistics = value; }
        }
        #endregion

        #endregion

        #region 日产量柱状图
        /// <summary>
        /// 日产量柱状图
        /// </summary>
        private SeriesCollection achievement = new SeriesCollection();

        public SeriesCollection Achievement
        {
            get { return achievement; }
            set { achievement = value; }
        }
        #endregion

        #region 颜色
        /// <summary>
        /// 颜色
        /// </summary>
        private ObservableCollection<string> _color = new ObservableCollection<string>();
        public ObservableCollection<string> Color
        {
            get => _color;
            set => SetProperty(ref _color, value);
        }
        #endregion

        #region 总计
        private int _totle;
        public int Totle
        {
            get => _totle;
            set => SetProperty(ref _totle, value);
        }
        #endregion

        #region 夹具状态
        private ObservableCollection<string> _statusColor = new ObservableCollection<string>();
        public ObservableCollection<string> StatusColor
        {
            get => _statusColor;
            set => SetProperty(ref _statusColor, value);
        }
        #endregion

        #region 夹具名称
        private ObservableCollection<string> _fixtureName = new ObservableCollection<string>();
        public ObservableCollection<string> FixtureName
        {
            get => _fixtureName;
            set => SetProperty(ref _fixtureName, value);
        }
        #endregion

        #region 夹具产量
        /// <summary>
        ///夹具产量
        /// </summary>
        private ObservableCollection<string> _production = new ObservableCollection<string>();
        public ObservableCollection<string> Production
        {
            get => _production;
            set => SetProperty(ref _production, value);
        }
        #endregion

        #region 发泡量
        /// <summary>
        /// 发泡量
        /// </summary>
        private ObservableCollection<int> _foamVolume = new ObservableCollection<int>();
        public ObservableCollection<int> FoamVolume
        {
            get => _foamVolume;
            set => SetProperty(ref _foamVolume, value);
        }
        #endregion
        
        #region 内侧温度
        private ObservableCollection<string> _internalTemperature = new ObservableCollection<string>();
        public ObservableCollection<string> InternalTemperature
        {
            get => _internalTemperature;
            set => SetProperty(ref _internalTemperature, value);
        }
        #endregion

        #region 侧板温度温度
        private ObservableCollection<string> _outsideTemperature = new ObservableCollection<string>();
        public ObservableCollection<string> OutsideTemperature
        {
            get => _outsideTemperature;
            set => SetProperty(ref _outsideTemperature, value);
        }
        #endregion

        #region 夹具节拍
        private ObservableCollection<string> _beat = new ObservableCollection<string>();
        public ObservableCollection<string> Beat
        {
            get => _beat;
            set => SetProperty(ref _beat, value);
        }
        #endregion

        #region 初始化发泡数据

        /// <summary>
        /// 初始化发泡数据
        /// </summary>
        /// <returns></returns>
        public async Task InitData(List<FixtureStatus> list)
        {
            try
            {
                int totalAmount = 0;
               
                if (list == null) return;
                FixtureName.Clear();
                Production.Clear();
                Beat.Clear();
                InternalTemperature.Clear();
                OutsideTemperature.Clear();
                StatusColor.Clear();
                foreach (var item in list)
                {
                    if (item.Status == 1) StatusColor.Add("Green");
                    if (item.Status == 2) StatusColor.Add("Red");
                    if (!string.IsNullOrEmpty(item.FixtureBoxType)) FixtureName.Add(item.FixtureBoxType);
                    if (!string.IsNullOrEmpty(item.Yield.ToString())) Production.Add(item.Yield.ToString());
              //      if (!string.IsNullOrEmpty(item.InternalTemperature.ToString())) InternalTemperature.Add(item.InternalTemperature.ToString());
              //      if (!string.IsNullOrEmpty(item.OutsideTemperature.ToString())) OutsideTemperature.Add(item.OutsideTemperature.ToString());
                    if (!string.IsNullOrEmpty(item.ProductionCycle.ToString())) Beat.Add(item.ProductionCycle.ToString());

                    totalAmount = totalAmount + item.Yield;
                }
                Totle = totalAmount;
            }
            catch(Exception ex) 
            {
                Console.WriteLine(ex.Message.ToString());
            }
        }
        #endregion




        #region 更新夹具型号
        /// <summary>
        /// 更新夹具型号
        /// </summary>
        public async void UpdateClampData(FixtureStatus fixtureStatus, BoxFoamDataRealTime bfd)
        {
            try
            {
                bfd.FixtureBoxtype = fixtureStatus.FixtureBoxType;
                bfd.FixtureStatus = fixtureStatus.Status.ToString();
                bfd.FixtureProductioncapacity = fixtureStatus.Yield;
                bfd.FixtureCuringtimesettingvalue = fixtureStatus.PlanCuringTime.ToString();
                bfd.FixtureActualtime = fixtureStatus.RealCuringTime.ToString();
                bfd.ModeInternaltemperature = fixtureStatus.InternalTemperature;
                bfd.ModeOutsidetemperature = fixtureStatus.InternalTemperature;
                bfd.Beat = fixtureStatus.Yield.ToString();
                bfd.UpdatedTime = DateTime.Now;

                await _boxFoamDataRealTimeServices.UpdateAsync(bfd);
            }
            catch { }
        }
        #endregion

        #region 新增夹具型号
        /// <summary>
        /// 更新夹具型号
        /// </summary>
        public async void SaveClampData(string productLineCode,FixtureStatus fixtureStatus)
        {
            var obj=await _sysUserInfoServices.GetProductLineInfo(productLineCode);
            if (obj!=null)
            {
                BoxFoamDataRealTime bfd = new BoxFoamDataRealTime();

                bfd.PlantCode = obj.PlantCode;
                bfd.ProductlineCode = productLineCode;
                bfd.ProcessCode = obj.ProcessCode;
                bfd.StationCode = obj.StationCode;
                bfd.SerialNumber = fixtureStatus.ObjId;
                bfd.FixtureBoxtype = fixtureStatus.FixtureBoxType;
                bfd.FixtureStatus = fixtureStatus.Status.ToString();
                bfd.FixtureProductioncapacity = fixtureStatus.Yield;
                bfd.FixtureCuringtimesettingvalue = fixtureStatus.PlanCuringTime.ToString();
                bfd.FixtureActualtime = fixtureStatus.RealCuringTime.ToString();
                bfd.ModeInternaltemperature = fixtureStatus.InternalTemperature;
                bfd.ModeOutsidetemperature = fixtureStatus.InternalTemperature;
                bfd.CreatedTime = DateTime.Now;
                bfd.UpdatedTime = DateTime.Now;

                await _boxFoamDataRealTimeServices.AddAsync(bfd);
            }
           
        }
        #endregion

        #region 原逻辑 Delete By wenjy 2024-01-09 14:38:00
        //Semaphore semaphore = new Semaphore(1, 1);
        ///// <summary>
        ///// 将采集到的数据保存
        ///// </summary>
        ///// <param name="mode"></param>

        //public async void RealTimeFoamingTask(object? sender, ElapsedEventArgs e)
        //{
        //    semaphore.WaitOne();

        //    try
        //    {
        //        string productLineCode = Appsettings.app("StationInfo", "ProductLineCode");

        //        DateTime now = DateTime.Now;
        //        CurrentTeamTime currentTeamTime = await _currentTeamTimeServices.FirstAsync(d => d.StartTime <= now && d.EndTime >= now);

        //        if (currentTeamTime!=null)
        //        {
        //            //比较计划更新数据
        //            ExecHourDataAsync(productLineCode);
        //        }
        //        else  
        //        {
        //            // 白夜班切换
        //            ShiftChangeAsync(productLineCode);
        //        }

        //    }
        //    catch (Exception ex)
        //    {
        //        Console.WriteLine(ex.Message);
        //    }
        //    finally
        //    {
        //        semaphore.Release();
        //    }
        //}

        //public async void ExecHourDataAsync(string productLineCode)
        //{
        //    List<FixtureStatus> bLis = CollectionFoamLine.listFixtureStatus;
        //    if (bLis.Count == 0) return;
        //    List<BoxFoamPlan> planList = await _boxFoamPlanServices.QueryAsync();
        //    List<BoxFoamDataRealTime> bfds = await _boxFoamDataRealTimeServices.QueryAsync();
        //    for (int j = 0; j < bLis.Count; j++)
        //    {
        //        try
        //        {
        //            if (string.IsNullOrEmpty(bLis[j].FixtureBoxType)) continue;
        //            BoxFoamPlan plan = planList.FirstOrDefault(d => d.MaterialCode == bLis[j].FixtureBoxType && d.PlanAmount > d.CompleteAmount);
        //            if (plan != null)
        //            {
        //                int complateAmount = 0;
        //                BoxFoamDataRealTime bfd = bfds.SingleOrDefault(d => d.FixtureBoxtype == bLis[j].FixtureBoxType && d.SerialNumber == bLis[j].ObjId);
        //                if (bfd != null)
        //                {        
        //                    //更新计划数量
        //                    complateAmount = bLis[j].Yield - bfd.FixtureProductioncapacity;
        //                    UpdateClampData(bLis[j], bfd);
        //                }
        //                else
        //                {
        //                    FixtureStatus fixtureStatus = bLis[j];
        //                    SaveClampData(productLineCode, fixtureStatus);
        //                }
        //                plan.CompleteAmount = plan.CompleteAmount + complateAmount;
        //                if (complateAmount>0)
        //                {
        //                    //保存历史记录
        //                    BoxFoamDataRealTimeHistory history = new BoxFoamDataRealTimeHistory();

        //                    history.PlantCode = bfd.PlantCode;
        //                    history.ProductlineCode = bfd.ProductlineCode;
        //                    history.ProcessCode = bfd.ProcessCode;
        //                    history.StationCode= bfd.StationCode;
        //                    history.FixtureProductioncapacity = bLis[j].Yield;
        //                    history.FixtureCuringtimesettingvalue = bLis[j].PlanCuringTime.ToString();
        //                    history.FixtureActualtime = bLis[j].RealCuringTime.ToString();
        //                    history.ModeInternaltemperature = bLis[j].InternalTemperature;
        //                    history.ModeOutsidetemperature = bLis[j].InternalTemperature;
        //                    history.UpdatedTime = DateTime.Now;
        //                    //事务合并
        //                    await _boxFoamDataRealTimeHistoryServices.AddAsync(history);
        //                    await _boxFoamPlanServices.UpdateAsync(plan);
        //                }
        //            }
        //            else
        //            {
        //                //更新小时数据
        //                BoxFoamDataRealTime bfd = bfds.SingleOrDefault(d => d.FixtureBoxtype == bLis[j].FixtureBoxType && d.SerialNumber == bLis[j].ObjId);
        //                if (bfd != null)
        //                {
        //                    UpdateClampData(bLis[j], bfd);
        //                }
        //                else
        //                {
        //                    SaveClampData(productLineCode, bLis[j]);
        //                }
        //            }
        //        }
        //        catch { }
        //    }
        //}

        //private async void ShiftChangeAsync(string productLineCode)
        //{
        //    try
        //    {
        //        //切换班组计划
        //        var currentTeamTimeList = await _sysUserInfoServices.GetTeamData();
        //        if (currentTeamTimeList.Count == 0) return;
        //        // 夹具
        //        var list = await _boxFoamDataRealTimeServices.QueryAsync(d => d.ProductlineCode == productLineCode);
        //        //更新计划表操作


        //        CurrentTeamTime currentTeamTime = await _currentTeamTimeServices.FirstAsync();


        //        // 更新当班时间
        //        currentTeamTime.TeamName = currentTeamTimeList.First().TeamName;
        //        currentTeamTime.StartTime = currentTeamTimeList.Min(d => d.StartTime);
        //        currentTeamTime.EndTime = currentTeamTimeList.Max(d => d.EndTime);
        //        bool result = await _currentTeamTimeServices.UpdateAsync(currentTeamTime);

        //        if (result)
        //        {
        //            //清空 当班计划
        //          //  var realTimeList = await _boxFoamDataRealTimeHistoryServices.QueryAsync(d => d.ProductlineCode == productLineCode);

        //            var plan = await _boxFoamPlanServices.QueryAsync(d => d.ProductLineCode == productLineCode);
        //            await _boxFoamPlanServices.DeletesAsync(plan);
        //        }
        //    }
        //    catch { }
        //}
        #endregion
    }
}