using Admin.Core.Common;
using Admin.Core.IService;
using Admin.Core.Model;
using Admin.Core.Model.Model_New;
using log4net;
using Serilog;
using StackExchange.Profiling.Internal;
using System.Collections.Generic;
using System.Timers;

/// <summary>
/// 测温数据采集
/// </summary>
namespace Aucma.Core.TemperatureTask
{
    public class AucamTemperatureMeasurementService: IAucamTemperatureMeasurementService
    {
        public delegate Task RefreshBoxFoamDataDelegate();
        public static event RefreshBoxFoamDataDelegate? RefreshBoxFoamDataDelegateEvent;

        private static readonly log4net.ILog logHelper = LogManager.GetLogger(typeof(AucamTemperatureMeasurementService));
        private readonly ITestedCodeMESServices _codeMESServices;
        private readonly ITemperatureHistoryServices _temperatureHistoryServices;
        private readonly IMaterialCompletionServices _materialCompletionServices;
        private readonly IPrintBarCodeServices _printBarCodeServices;
        private readonly IReportQualityInspectionServices _reportQualityInspectionServices;


        System.Timers.Timer timer1 = new System.Timers.Timer(5000);
        bool flag = true;
        public AucamTemperatureMeasurementService(ITemperatureHistoryServices temperatureHistoryServices,
            ITestedCodeMESServices codeMESServices, IMaterialCompletionServices materialCompletionServices, 
            IPrintBarCodeServices printBarCodeServices, IReportQualityInspectionServices reportQualityInspectionServices)
        {
            _codeMESServices = codeMESServices;
            _temperatureHistoryServices = temperatureHistoryServices;
            _materialCompletionServices = materialCompletionServices;
            _printBarCodeServices = printBarCodeServices;
            _reportQualityInspectionServices = reportQualityInspectionServices;
        }

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

        #region 采集任务处理
        /// <summary>
        /// 采集任务处理
        /// </summary>
        /// <returns></returns>
        private async void Run(object? sender, ElapsedEventArgs e)
        {
            try
            {
               
                if (flag)
                {
                    try
                    {
                        flag = false;
                        var historyList = _codeMESServices.QueryAsync(d => d.IsSync == 0).Result;
                        if (historyList == null || historyList.Count == 0) return;
                        Console.WriteLine($"【{DateTime.Now}】开始读取测温数据");
                        Console.WriteLine(historyList.ToJson());
                        var query = (from a in historyList
                                     select new TemperatureHistory
                                     {
                                         Line_No = a.Line_No,
                                         GongwNo = a.GongwNo,
                                         CpNo = a.CpNo,
                                         CpModel = a.CpModel,
                                         FactoryModel = a.factoryModel,
                                         Voltage = a.Voltage,
                                         Frequency = a.Frequency,
                                         Point2 = a.Point2,
                                         TestTime = a.TestTime,
                                         TestedTime = a.TestedTime,
                                         Etemp = a.Etemp,
                                         BeginDateTime = Convert.ToDateTime(a.BeginDateTime),
                                         CpResult = a.CpResult,
                                         EndDateTime = Convert.ToDateTime(a.EndDateTime),
                                         UserName = a.UserName,
                                         Remark = a.Remark,
                                         TestNo = a.TestNo,
                                         Temp_Mes = a.Temp_Mes,
                                         Power_Mes = a.Power_Mes,
                                         Part_Mes = a.Part_Mes,
                                         LowV_Time = a.LowV_Time,
                                         LowV_PowerMin = a.LowV_PowerMin,
                                         LowV_PowerMax = a.LowV_PowerMax,
                                         LowV_PowerFact = a.LowV_PowerFact,
                                         LowVoltage = a.LowVoltage,
                                         SyncDate = DateTime.Now,
                                         IsFlag = 0
                                     }).ToList();

                        if (query == null || query.Count == 0) return;
                        logHelper.Error($"读取数据个数:{historyList.Count()}");
                        Console.WriteLine($"【{DateTime.Now}】读取数据个数:{historyList.Count()}");
                        var result = _temperatureHistoryServices.AddAsync(query).Result;
                        if (result > 0)
                        {
                            historyList.ForEach(d => d.IsSync = 1);
                            int r = _codeMESServices.UpateTemperatureHistoryFlag(historyList);
                            if (r > 0)
                            {
                                InsertToCompleteAndCheck(query);//保存过点数据
                                ToMes();//更新测温质检数据
                                Console.WriteLine($"【{DateTime.Now}】保存测温数据成功!保存数量:{query.Count}");
                            }
                        }
                        Console.WriteLine($"【{DateTime.Now}】测温数据同步成功!数量:{query.Count}");
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine($"【{DateTime.Now}】 {ex.Message}");
                        logHelper.Error(ex.Message);
                    }
                    finally { flag = true; }
                }
            }
            catch (Exception ex)
            {
                logHelper.Error($"测温数据处理异常:{ex.Message}");
                Console.WriteLine($"测温数据处理异常:{ex.Message}");
            }
        }
        #endregion

        #region 保存过点数和测温质检

        /// <summary>
        /// 保存过点数和测温质检
        /// </summary>
        /// <param name="list"></param>
        /// <returns></returns>
        public bool InsertToCompleteAndCheck(List<TemperatureHistory> list)
        {
            List<MaterialCompletion> completionList = new List<MaterialCompletion>();
            var printBarCodeList = _printBarCodeServices.QueryAsync().Result;
            foreach (var temperatureHistory in list)
            {
                PrintBarCode barcode = printBarCodeList.First(d => d.MaterialBarcode == temperatureHistory.CpNo);
                if (barcode == null) return false;
                #region 更新过点数据    
                MaterialCompletion completion = new MaterialCompletion();
                completion.OrderCode = barcode.OrderCode;
                completion.MaterialBarcode = temperatureHistory.CpNo;
                completion.MaterialCode = barcode.MaterialCode;
                completion.MaterialName = barcode.MaterialName;
                string stationName = Appsettings.app("Common", "StationName");
                completion.StationName = stationName;
                completion.ProductLineCode = "CX_02";
                completion.CompleteDate = DateTime.Now;
                completionList.Add(completion);
                #endregion
            }
            int r = _materialCompletionServices.AddAsync(completionList).Result;
            if (r > 0) return true;
            else return false;

        }

        #endregion

        #region 发送质检请求
        /// <summary>
        /// 发送质检请求
        /// </summary>
        /// <param name="list"></param>
        /// <returns></returns>
        public  void ToMes()
        {
            try
            {
                var list =  _temperatureHistoryServices.QueryAsync(d => d.IsFlag == 0).Result;
                if (list == null || list.Count == 0) return;
                Console.WriteLine($"【{DateTime.Now}】开始向质检发送测温数据");
                foreach (var temperatureHistory in list)
                {
                    //var r= _reportQualityInspectionServices.FirstAsync(d => d.BarCode == temperatureHistory.CpNo && d.TreatmentMeasure == "3"&& d.StationCode=="2009").Result;
                    //if (r != null)
                    //{
                    //    var checkList = _temperatureHistoryServices.GetAllIsFlag(temperatureHistory.ObjId).Result;
                    //    if (checkList != null)
                    //    {
                    //        var check = checkList.First();
                    //        r.FinishTime = check.FinishTime;
                    //        r.BarCode = check.BarCode;
                    //        r.MaterialName = check.MaterialName;
                    //        r.ProcessCode = check.ProcessCode;
                    //        r.TestItemCode = check.TestItemCode;
                    //        r.QualityDefectCode = check.QualityDefectCode;
                    //        r.QualityDefectName = check.QualityDefectName;
                    //        r.TreatmentMeasure = check.TreatmentMeasure;
                    //        r.ProcessResult = check.ProcessResult;
                    //        r.GroupCode = check.GroupCode;
                    //        r.InspectorCode = check.InspectorCode;
                    //        r.InspectorTime = check.InspectorTime;
                    //        r.ReworkNumber = check.ReworkNumber;
                    //        r.IsFlag = check.IsFlag;
                    //        r.StationCode = check.StationCode;
                    //        r.UpdatedTime = check.UpdateTime;
                           
                    //        bool reportResult = _reportQualityInspectionServices.UpdateAsync(r).Result;
                    //        if (reportResult)
                    //        {
                    //            temperatureHistory.IsFlag = 1;
                    //            _ = _temperatureHistoryServices.UpdateAsync(temperatureHistory).Result;
                    //        }
                    //    }
                    //}
                    //else
                    {
                        var checkList = _temperatureHistoryServices.GetAllIsFlag(temperatureHistory.ObjId).Result;
                        if (checkList != null)
                        {
                            var check = checkList.First();
                            ReportQualityInsPection report = new ReportQualityInsPection();
                            if (check.TreatmentMeasure == "3")
                            {
                                report.FinishTime = null;
                                report.UpdatedTime = null;
                            }
                            else
                            {
                                report.FinishTime = check.FinishTime;
                                report.UpdatedTime = null;
                            }

                            report.BarCode = check.BarCode;
                            report.MaterialName = check.MaterialName;
                            report.ProcessCode = check.ProcessCode;
                            report.TestItemCode = check.TestItemCode;
                            report.QualityDefectCode = check.QualityDefectCode;
                            report.QualityDefectName = check.QualityDefectName;
                            report.TreatmentMeasure = check.TreatmentMeasure;
                            report.ProcessResult = check.ProcessResult;
                            report.GroupCode = check.GroupCode;
                            report.InspectorCode = check.InspectorCode;
                            report.InspectorTime = check.InspectorTime;
                            report.ReworkNumber = check.ReworkNumber;
                            report.IsFlag = check.IsFlag;
                            report.StationCode = check.StationCode;
                            report.UpdatedTime = check.UpdateTime;
                            int reportResult = _reportQualityInspectionServices.AddAsync(report).Result;
                            if (reportResult > 0)
                            {
                                temperatureHistory.IsFlag = 1;
                                _ = _temperatureHistoryServices.UpdateAsync(temperatureHistory).Result;
                            }
                        }
                    }
                }
                Console.WriteLine($"【{DateTime.Now}】更新测温质检数据成功!");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"【{DateTime.Now}】更新测温质检数据失败!原因:{ex.Message}");
            }
        }
        #endregion
    }
    public class Result{
        /// <summary>
        /// 返回抓鬼太
        /// </summary>
        public int code { get; set; }
        /// <summary>
        /// 返回信息
        /// </summary>
        public string msg { get; set; }
    }
}