using Admin.Core.Common;
using Admin.Core.IService;
using Admin.Core.Model;
using Admin.Core.Model.Model_New;
using Admin.Core.Model.ViewModels;
using Admin.Core.Service;
using Aucma.Core.HwPLc;
using Aucma.Core.OldBoxFoam.Business;
using Aucma.Core.OldBoxFoam.Models;
using Aucma.Core.OldBoxFoam.Views;
using CommunityToolkit.Mvvm.ComponentModel;
using log4net;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging.Log4Net.AspNetCore.Extensions;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Timers;
using static NPOI.HSSF.Util.HSSFColor;
/**
 * 老发泡线监控
 * */
namespace Aucma.Core.OldBoxFoam.ViewModels
{
    public  partial class OldBoxFoamPageViewModel : ObservableObject
    {
        IBoxFoamDataServices? _oldBoxFoamDataServices;
        IOldBoxFoamTypeServices _oldBoxFoamTypeServices;
        private readonly IBoxFoamPlanServices _boxFoamPlanServices;
        private readonly ISysUserInfoServices _sysUserInfoServices;
        private readonly ICurrentTeamTimeServices _currentTeamTimeServices;
        private readonly IBoxFoamDataRecordServices _boxFoamDataRecordServices;
        private readonly IBoxFoamDataRealTimeServices? _boxFoamDataRealTimeServices;
        private readonly IBoxFoamDataRealTimeHistoryServices _boxFoamDataRealTimeHistoryServices;

        private static readonly log4net.ILog log = LogManager.GetLogger(typeof(OldBoxFoamPageViewModel));
        System.Timers.Timer timer2 = new System.Timers.Timer(10000);
        int totalAmount = 0;
        bool flag = true;

        private Collection collection = new Collection();

        public OldBoxFoamPageViewModel() {
            _oldBoxFoamDataServices = App.ServiceProvider.GetService<IBoxFoamDataServices>();
            _oldBoxFoamTypeServices = App.ServiceProvider.GetService<IOldBoxFoamTypeServices>();
            _boxFoamPlanServices = App.ServiceProvider.GetService<IBoxFoamPlanServices>();
            _sysUserInfoServices = App.ServiceProvider.GetService<ISysUserInfoServices>();
            _currentTeamTimeServices = App.ServiceProvider.GetService<ICurrentTeamTimeServices>();
            _boxFoamDataRealTimeServices = App.ServiceProvider.GetService<IBoxFoamDataRealTimeServices>();
            _boxFoamDataRecordServices = App.ServiceProvider.GetService<IBoxFoamDataRecordServices>();
            _boxFoamDataRealTimeHistoryServices = App.ServiceProvider.GetService<IBoxFoamDataRealTimeHistoryServices>();
            collection.RefreshFoamMachineEvent += info =>
            {
                OldBoxFoamOnLoad(info);
            };
            timer2.Elapsed += new System.Timers.ElapsedEventHandler(RealTimeFoamingTask);
            timer2.AutoReset = true;
            timer2.Enabled = true;
            timer2.Start();

            //班组信息切换
            TeamSwitchBusiness teamSwitchBusiness = new TeamSwitchBusiness();
            teamSwitchBusiness.Init();
        }

        #region 初始化加载数据

        private void OldBoxFoamOnLoad(List<FixtureStatus> prderList)
        {
            try
            {
                int num = prderList.Sum(d => d.Yield);
                if (prderList.Count==0) return;
                totalAmount = 0;
                _fixtureName.Clear();
                _production.Clear();
                _beat.Clear();
                _statusColor.Clear();
                foreach (var item in prderList)
                {
                    if(item.FixtureBoxType == "0")
                    {
                        item.Status = 3;
                    }
                    switch (item.Status)
                    {
                        case 1: 
                            _statusColor.Add("Yellow"); 
                            //Console.WriteLine("Yellow");
                            break;
                        case 2: 
                            _statusColor.Add("Green");
                            //Console.WriteLine("Green");
                            break;
                        case 3: 
                            _statusColor.Add("Red"); 
                            //Console.WriteLine("Red");
                            break;
                        default: 
                            _statusColor.Add("Red");
                            //Console.WriteLine("Gray");
                            break;
                    }

                    _fixtureName.Add(item.FixtureBoxType);
                    _production.Add(item.Yield);
                    totalAmount = totalAmount + item.Yield;
                }
                Totle = totalAmount.ToString();
            }
            catch (Exception ex)
            {
                log.Error("获取库存接口数据异常." + ex.Message);
            }
        }
       
        public async Task OldBoxFoamTypeOnLoad()
        {
            var list =await  _oldBoxFoamTypeServices.QueryAsync();
            if (list == null) return;
            foreach (var item in list)
            {
                OldBoxFoamTypeModel model = new OldBoxFoamTypeModel();
                model.ObjId = item.ObjId;
                model.Local = item.Local;
                model.Boxtype = item.Boxtype;
                model.Storeamount = item.Storeamount;
                _oldBoxFoamTypeDataGrid.Add(model);
            }
        }
        public  Task OldBoxFoamTypeOnLoad3(List<OldBoxFoamType> list)
        {
            if (list == null) return Task.CompletedTask;

            System.Windows.Application.Current.Dispatcher.Invoke((Action)(() =>
            {
                OldBoxFoamTypeDataGrid.Clear();
                foreach (var item in list)
                {
                    OldBoxFoamTypeModel model = new OldBoxFoamTypeModel();
                    model.ObjId = item.ObjId;
                    model.Local = item.Local;
                    model.Boxtype = item.Boxtype;
                    model.Storeamount = item.Storeamount;
                    OldBoxFoamTypeDataGrid.Add(model);
                }
            }));
            return Task.CompletedTask;
        }
        #endregion

        #region 初始化发泡线 datagrid
        private ObservableCollection<OldBoxFoamDataModel> _oldBoxFoamDataGrid = new ObservableCollection<OldBoxFoamDataModel>();
        public ObservableCollection<OldBoxFoamDataModel> OldBoxFoamDataGrid
        {
            get => _oldBoxFoamDataGrid;
            set => SetProperty(ref _oldBoxFoamDataGrid, value);
        }
        #endregion

        #region 初始化泡前库 datagrid
        private ObservableCollection<OldBoxFoamTypeModel> _oldBoxFoamTypeDataGrid = new ObservableCollection<OldBoxFoamTypeModel>();
        public ObservableCollection<OldBoxFoamTypeModel> OldBoxFoamTypeDataGrid
        {
            get => _oldBoxFoamTypeDataGrid;
            set => SetProperty(ref _oldBoxFoamTypeDataGrid, 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<int> _production = new ObservableCollection<int>();
        public ObservableCollection<int> Production
        {
            get => _production;
            set => SetProperty(ref _production, value);
        }
        #endregion

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

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

        Semaphore semaphore = new Semaphore(1, 1);


        #region 原数据采集方法
        /// <summary>
        /// 将采集到的数据保存
        /// </summary>
        /// <param name="mode"></param>
        private void RealTimeFoamingTask(object? sender, ElapsedEventArgs e)
        {
            semaphore.WaitOne();
            try
            {
                collection.startCollect();
            }
            catch (Exception ex)
            {
                log.Error("设备数据读取异常:" + ex.Message);
                Console.WriteLine(ex.Message.ToString());
            }
            finally
            {
                semaphore.Release();
            }
        }
        #endregion

        public static void MouseClick(string boxType, int plcId, string address)
        {
            if (!string.IsNullOrEmpty(boxType))
            {
                SetBoxTypeView setBoxTypeView = new SetBoxTypeView(boxType);
                setBoxTypeView.ShowDialog();

                if (setBoxTypeView.boxTypeResult != boxType)
                {
                    if (!string.IsNullOrEmpty(setBoxTypeView.boxTypeResult))
                    {
                        HwPLc.PlcModel plc = HwPLc.PlcHelper.melsecList.FirstOrDefault(d => d.Id == plcId);
                        if (plc != null)
                        {
                            bool isFlag = plc.plc.WriteInt16(address, setBoxTypeView.boxTypeResult);

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

        #region 原班组切换逻辑 Delete By wenjy 2024-01-08 11:17:00
        //private async void ShiftChange(string productLineCode)
        //{
        //    //切换班组计划
        //    var list = await _oldBoxFoamDataServices.QueryAsync(d => d.ProductLineCode == productLineCode);
        //    List<BoxFoamDataRecord> recordList = new List<BoxFoamDataRecord>();
        //    var currentTeamTimeList = await _sysUserInfoServices.GetTeamData();
        //    if (currentTeamTimeList.Count == 0) return;
        //    //更新计划表操作
        //    CurrentTeamTime currentTeamTime = await _currentTeamTimeServices.FirstAsync();
        //    currentTeamTime.TeamName = currentTeamTimeList.FirstOrDefault().TeamName;
        //    currentTeamTime.StartTime = currentTeamTimeList.Min(d => d.StartTime);
        //    currentTeamTime.EndTime = currentTeamTimeList.Max(d => d.EndTime);

        //    //可以使用Mapping 映射
        //    list.ForEach(d =>
        //    {
        //        BoxFoamDataRecord record = new BoxFoamDataRecord();
        //        record.OrderCode = d.OrderCode;
        //        record.ProductLineCode = d.ProductLineCode;
        //        record.Fixturestatus = d.Production;
        //        record.CuringTimeSettingValue = d.CuringTimeSettingValue;
        //        record.ActualValue = d.ActualValue;
        //        record.AnHour = d.AnHour;
        //        record.TwoHour = d.TwoHour;
        //        record.ThreeHour = d.ThreeHour;
        //        record.FourHour = d.FourHour;
        //        record.FiveHour = d.FiveHour;
        //        record.SixHour = d.SixHour;
        //        record.SevenHour = d.SevenHour;
        //        record.EightHour = d.EightHour;
        //        record.NineHour = d.NineHour;
        //        record.TenHour = d.TenHour;
        //        record.ElevenHour = d.ElevenHour;
        //        record.TwelveHour = d.TwelveHour;
        //        record.BoxFixturesideplate = d.BoxFixturesideplate;
        //        record.BoxClosebetatemperature = d.BoxClosebetatemperature;
        //        record.BoxBeat = d.BoxBeat;
        //        record.CreateTime = DateTime.Now;
        //    });
        //    await _currentTeamTimeServices.UpdateAsync(currentTeamTime);
        //    if (recordList == null) return;
        //    int result = await _boxFoamDataRecordServices.AddAsync(recordList);
        //    if (result > 0)
        //    {
        //        var obj1 = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("OldMelsecPlc1"));
        //        if (obj1 != null) {
        //            if (obj1.plc.IsConnected)
        //            {
        //                obj1.plc.WriteInt16("M216", "1");//换班 数据清空
        //            }
        //        }
        //        var obj2 = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("OldMelsecPlc2"));
        //        if (obj2 != null)
        //        {
        //            if (obj2.plc.IsConnected)
        //            {
        //                obj2.plc.WriteInt16("M216", "1");//换班 数据清空
        //            }
        //        }
        //        var obj3 = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("OldMelsecPlc3"));
        //        if (obj3 != null)
        //        {
        //            if (obj3.plc.IsConnected)
        //            {
        //                obj3.plc.WriteInt16("M216", "1");//换班 数据清空
        //            }
        //        }
        //        var obj4 = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("OldMelsecPlc4"));
        //        if (obj4 != null)
        //        {
        //            if (obj4.plc.IsConnected)
        //            {
        //                obj4.plc.WriteInt16("M216", "1");//换班 数据清空
        //            }
        //        }

        //        //清空 当班计划
        //        await _oldBoxFoamDataServices.UpdateAsync(list);
        //        var planList=_boxFoamPlanServices.QueryAsync().Result;
        //        planList.ForEach(d => { d.ShiftType = 0; });
        //        await _boxFoamPlanServices.UpdateAsync(planList);
        //    }
        //}
        #endregion

        #region 原计划完工逻辑 Delete By wenjy 2024-01-07 10:11:00
        //private async void ExecHourData(string productLineCode)
        //{
        //    try
        //    {
        //        List<FixtureStatus> bList = new List<FixtureStatus>();


        //        var collectionList = Collection.listFixtureStatus;
        //        if (collectionList.Count == 0) return;
        //        OldBoxFoamOnLoad(collectionList);
        //        bList.AddRange(collectionList);
        //        List<BoxFoamData> bfds = await _oldBoxFoamDataServices.QueryAsync();
        //        List<OldBoxFoamType> spaceList = await _oldBoxFoamTypeServices.QueryAsync();
        //        List<BoxFoamPlan> planList = await _boxFoamPlanServices.QueryAsync();
        //        for (int j = 0; j < bList.Count; j++)
        //        {
        //            try
        //            {
        //                OldBoxFoamType space = spaceList.FirstOrDefault(d => d.Boxtype == bList[j].FixtureBoxType);
        //                //根据夹具找货道,根据货道找物料
        //                if (space != null)
        //                {
        //                    BoxFoamPlan plan = planList.FirstOrDefault(d => d.MaterialCode == space.MaterialCode && d.PlanAmount > d.CompleteAmount);
        //                    if (plan != null)
        //                    {
        //                        int complateAmount = 0;
        //                        //更新小时数据
        //                        BoxFoamData bfd = bfds.FirstOrDefault(d => d.Fixtureboxtype == bList[j].FixtureBoxType && d.MainId == bList[j].ObjId);
        //                        if (bfd != null)
        //                        {
        //                            //更新计划数量
        //                            complateAmount = bList[j].Yield - bfd.Production;
        //                            UpdateBoxData(bList[j], bfd);
        //                        }
        //                        else
        //                        {
        //                            SaveBoxData(productLineCode, bList[j]);
        //                        }
        //                        plan.CompleteAmount = plan.CompleteAmount + complateAmount;
        //                        await _boxFoamPlanServices.UpdateAsync(plan);
        //                    }
        //                    else
        //                    {
        //                        //更新小时数据
        //                        BoxFoamData bfd = bfds.FirstOrDefault(d => d.Fixtureboxtype == bList[j].FixtureBoxType && d.MainId == bList[j].ObjId);
        //                        if (bfd != null)
        //                        {
        //                            UpdateBoxData(bList[j], bfd);
        //                        }
        //                        else
        //                        {
        //                            SaveBoxData(productLineCode, bList[j]);
        //                        }
        //                    }
        //                }
        //                else
        //                {
        //                    //更新小时数据
        //                    BoxFoamData bfd = bfds.FirstOrDefault(d => d.Fixtureboxtype == bList[j].FixtureBoxType && d.MainId == bList[j].ObjId);
        //                    if (bfd != null)
        //                    {
        //                        UpdateBoxData(bList[j], bfd);
        //                    }
        //                    else
        //                    {
        //                        SaveBoxData(productLineCode, bList[j]);
        //                    }
        //                }
        //            }
        //            catch { }

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

        //private async void UpdateBoxData(FixtureStatus item, BoxFoamData bfd)
        //{
        //    int hour = GetTeamHour(DateTime.Now).Seq;
        //    switch (hour)
        //    {
        //        case 1:
        //            bfd.AnHour = item.Yield - bfd.Production;
        //            break;
        //        case 2:
        //            bfd.TwoHour = item.Yield - bfd.Production;
        //            break;
        //        case 3:
        //            bfd.ThreeHour = item.Yield - bfd.Production;
        //            break;
        //        case 4:
        //            bfd.FourHour = item.Yield - bfd.Production;
        //            break;
        //        case 5:
        //            bfd.FiveHour = item.Yield - bfd.Production;
        //            break;
        //        case 6:
        //            bfd.SixHour = item.Yield - bfd.Production;
        //            break;
        //        case 7:
        //            bfd.SevenHour = item.Yield - bfd.Production;
        //            break;
        //        case 8:
        //            bfd.EightHour = item.Yield - bfd.Production;
        //            break;
        //        case 9:
        //            bfd.NineHour = item.Yield - bfd.Production;
        //            break;
        //        case 10:
        //            bfd.TenHour = item.Yield - bfd.Production;
        //            break;
        //        case 11:
        //            bfd.ElevenHour = item.Yield - bfd.Production;
        //            break;
        //        case 12:
        //            bfd.TwelveHour = item.Yield - bfd.Production;
        //            break;
        //        default:
        //            break;
        //    }

        //    bfd.Production = item.Yield;

        //    await _oldBoxFoamDataServices.UpdateAsync(bfd);
        //}

        //private async void SaveBoxData(string productLineCode, FixtureStatus item)
        //{
        //    BoxFoamData bfdata = new BoxFoamData();
        //    bfdata.MainId = item.ObjId;
        //    bfdata.ProductLineCode = productLineCode;
        //    bfdata.Fixtureboxtype = item.FixtureBoxType;
        //    bfdata.Fixturestatus = item.Status;
        //    bfdata.Production = item.Yield;
        //    bfdata.CuringTimeSettingValue = item.PlanCuringTime.ToString();
        //    bfdata.ActualValue = item.RealCuringTime.ToString();
        //    int hour = GetTeamHour(DateTime.Now).Seq;
        //    switch (hour)
        //    {
        //        case 1:
        //            bfdata.AnHour = item.Yield = bfdata.Production;
        //            break;
        //        case 2:
        //            bfdata.TwoHour = item.Yield = bfdata.Production;
        //            break;
        //        case 3:
        //            bfdata.ThreeHour = item.Yield = bfdata.Production;
        //            break;
        //        case 4:
        //            bfdata.FourHour = item.Yield = bfdata.Production;
        //            break;
        //        case 5:
        //            bfdata.FiveHour = item.Yield = bfdata.Production;
        //            break;
        //        case 6:
        //            bfdata.SixHour = item.Yield = bfdata.Production;
        //            break;
        //        case 7:
        //            bfdata.SevenHour = item.Yield = bfdata.Production;
        //            break;
        //        case 8:
        //            bfdata.EightHour = item.Yield = bfdata.Production;
        //            break;
        //        case 9:
        //            bfdata.NineHour = item.Yield = bfdata.Production;
        //            break;
        //        case 10:
        //            bfdata.TenHour = item.Yield = bfdata.Production;
        //            break;
        //        case 11:
        //            bfdata.ElevenHour = item.Yield = bfdata.Production;
        //            break;
        //        case 12:
        //            bfdata.TwelveHour = item.Yield = bfdata.Production;
        //            break;
        //        default:
        //            break;
        //    }
        //    bfdata.MainId = item.ObjId;
        //    await _oldBoxFoamDataServices.AddAsync(bfdata);
        //}

        //public CurrentTeamTimeView GetTeamHour()
        //{
        //    DateTime now = DateTime.Now;
        //    var list = _sysUserInfoServices.GetTeamData().Result;
        //    if (list != null)
        //    {
        //        //var obj = list.FirstOrDefault().EndTime.ToString("HH:mm");
        //        var view = list.FirstOrDefault();
        //        return view;
        //    }
        //    return null;
        //}

        //public CurrentTeamTimeView GetTeamHour(DateTime now)
        //{
        //    var obj = _sysUserInfoServices.GetTeamData(now).Result;
        //    if (obj != null)
        //    {
        //        return obj;
        //    }
        //    return null;
        //}
        #endregion

    }
}