using GalaSoft.MvvmLight.Command;
using Microsoft.Extensions.DependencyInjection;
using SlnMesnac.Business.business;
using SlnMesnac.Model.domain;
using SlnMesnac.Repository.service;
using SlnMesnac.WPF.Views;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;

namespace SlnMesnac.WPF.ViewModel
{
    public class ProductionReportViewModel : INotifyPropertyChanged
    {
        private ProdPlanInfoService _prodPlanInfoService;
        private ProdPlanDetailService _prodPlanDetailService;
        private IBaseStaffService _baseStaffService;
        private DatabaseHandleBusniess _databaseHandleBusniess;
        private ProdPLanInfo planInfo;
        private ProdPlanDetail planDetail;
        private double complateRate;
        private double currentAmountDouble;
        private double newAmountDouble;
        private double result;


        #region
        /// <summary>
        /// 按钮文字转换事件
        /// </summary>
        public event PropertyChangedEventHandler PropertyChanged = delegate { };

        //刷新委托
        public delegate void RefreshDelegate(ProdPLanInfo pLanInfo);
        public static event RefreshDelegate RefreshDelegateEvent;

        public static Action<int>? RefrashClearAction;
        #endregion

        public ProductionReportViewModel()
        {
            _prodPlanDetailService = App.ServiceProvider.GetService<ProdPlanDetailService>();
            _prodPlanInfoService = App.ServiceProvider.GetService<ProdPlanInfoService>();
            _databaseHandleBusniess = App.ServiceProvider.GetService<DatabaseHandleBusniess>();
            _baseStaffService = App.ServiceProvider.GetService<IBaseStaffService>();
            ConfirmCommand = new RelayCommand(Confirm);
            EndPlanCommand = new RelayCommand(EndPlan);
            ContinueCommand = new RelayCommand(Continue);
            PauseCommand = new RelayCommand(Pause);
            EndButtonColor = "Red";
            Init();
            if (RfidHandleBusniess.theNewAmount != "")
            {
                NewAmountText = RfidHandleBusniess.theNewAmount;
            }
        }

        private void Init()
        {
            planInfo = _prodPlanInfoService.GetPlanInfoByConditions("", "", "", RfidHandleBusniess.stationCode, "1").FirstOrDefault();
            if (planInfo != null)
            {
                complateRate = GetComplateRate(Convert.ToDouble(planInfo.CompleteAmount), planInfo.PlanAmount);
                if (complateRate > -10)
                {
                    EndButtonColor = "#FF11B514";
                }
            }
            Refresh();
        }

        private void Refresh()
        {
            if (planInfo != null)
            {
                planDetail = _prodPlanDetailService.GetPlanDetailsByPlanCode(planInfo.PlanCode).FirstOrDefault();
                PlanAmountText = planInfo.PlanAmount.ToString();
                CompleteAmountText = planInfo.CompleteAmount.ToString();
            }
            else
            {
                HintText = "没有正在执行的工单，请执行工单！";
            }
        }

        #region 定义属性
        /// <summary>
        /// 计划数量Text
        /// </summary>
        private string planAmountText;
        public string PlanAmountText
        {
            get { return planAmountText; }
            set { planAmountText = value; OnPropertyChanged("PlanAmountText"); }
        }

        /// <summary>
        /// 完成数量Text
        /// </summary>
        private string completeAmountText;
        public string CompleteAmountText
        {
            get { return completeAmountText; }
            set { completeAmountText = value; OnPropertyChanged("CompleteAmountText"); }
        }

        /// <summary>
        /// 新增数量Text
        /// </summary>
        private string newAmountText;
        public string NewAmountText
        {
            get { return newAmountText; }
            set { newAmountText = value; OnPropertyChanged("NewAmountText"); }
        }

        /// <summary>
        /// 提示框
        /// </summary>
        private string hintText;
        public string HintText
        {
            get { return hintText; }
            set { hintText = value; OnPropertyChanged("HintText"); }
        }

        /// <summary>
        /// 结束按钮颜色
        /// </summary>
        private string endButtonColor;
        public string EndButtonColor
        {
            get { return endButtonColor;}
            set { endButtonColor = value; OnPropertyChanged("EndButtonColor"); }
        }
        #endregion

        /// <summary>
        /// 暂停
        /// </summary>
        public ICommand PauseCommand { get; set; }

        /// <summary>
        /// 继续
        /// </summary>
        public ICommand ContinueCommand {  get; set; }

        /// <summary>
        /// 确认命令
        /// </summary>
        public ICommand ConfirmCommand { get; private set; }

        /// <summary>
        /// 确认事件
        /// </summary>
        private void Confirm()
        {
            // 获取最新工单明细的结束时间
            var detail = _databaseHandleBusniess.GetLastDetailEndTime(planInfo.PlanCode);

            // 如果最新工单明细没有结束时间，跳过时间判断
            if (!string.IsNullOrEmpty(detail.EndTime))
            {
                DateTime startTime = DateTime.Parse(detail.EndTime);
                if ((DateTime.Now - startTime).TotalMinutes <= 15)
                {
                    HintText = "当前工单距离上次提交不足15分钟！";
                    return;
                }
            }

            // 如果没有班组当班，直接返回
            if (!EmployeeLoginViewModel.isOnDuty)
            {
                HintText = "没有班组当班，无法执行此操作！";
                return;
            }

            // 获取班组长信息
            var monitor = _databaseHandleBusniess.GetMonitor(RfidHandleBusniess.stationCode);
            if (monitor == null)
            {
                HintText = "班长未打卡，无法执行此操作！";
                return;
            }

            //
            complateRate = GetComplateRate(Convert.ToDouble(planInfo.CompleteAmount), planInfo.PlanAmount);
            if (complateRate > 10)
            {
                HintText = "实际数量已超过计划数量，请结束工单";
                return;
            }

            // 获取新输入的产量
            string newAmount = NewAmountText?.Trim();
            if (string.IsNullOrEmpty(newAmount))
            {
                HintText = "不能为空！";
                return;
            }

            // 验证输入的产量是否为数字
            if (!IsNumeric(newAmount))
            {
                HintText = "输入有误，请输入阿拉伯数字！";
                return;
            }

            // 更新计划信息
            RfidHandleBusniess.theNewAmount = newAmount;
            double currentAmountDouble = Convert.ToDouble(planInfo.CompleteAmount);
            double newAmountDouble = Convert.ToDouble(newAmount);
            double result = currentAmountDouble + newAmountDouble;

            // 设置工单明细
            planDetail.CurrentStaffId = monitor.staffId; // 班长ID
            planDetail.CreatedBy = monitor.staffName; // 班长名称
            planDetail.CompleteAmount = newAmountDouble.ToString();
            planInfo.CompleteAmount = result.ToString();
            planDetail.BeginTime = planDetail.EndTime ?? ExecuteViewModel.theStartTime;
            planDetail.EndTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
            planDetail.BatchNumber += 1;

            // 保存数据
            var realTimes = _databaseHandleBusniess.GetRecordStaffRealTimes();
            _prodPlanDetailService.Insert(planDetail);
            _prodPlanInfoService.Update(planInfo);
            _databaseHandleBusniess.InsertPlanExecuteUser(planInfo, planDetail, realTimes);

            // 刷新并更新UI
            Refresh();
            HintText = "已提交！";
            RefreshDelegateEvent?.Invoke(planInfo);

            // 更新完成率
            complateRate = GetComplateRate(result, PlanAmountText);
            if (complateRate > -10)
            {
                EndButtonColor = "#FF11B514";
            }
        }

        // 检查字符串是否为有效数字
        private bool IsNumeric(string value)
        {
            return value.All(c => char.IsDigit(c) || c == '.');
        }

        /// <summary>
        /// 结束工单命令
        /// </summary>
        public ICommand EndPlanCommand { get; private set; }
        private void EndPlan()
        {
            // 判断工单实际产量与目标产量的差距，满足才能执行结束
            if (complateRate > -10)
            {
                if (EmployeeLoginViewModel.isOnDuty == true) // 是否有班组当班，无当班时操作无效
                {
                    if (planDetail != null && planInfo != null)
                    {
                        // planDetail.EndTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                        //_prodPlanDetailService.Insert(planDetail);
                        planInfo.PlanStatus = "2";
                        planInfo.EndTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");

                        double planAmountDouble = Convert.ToDouble(planInfo.PlanAmount);
                        double completeAmountDouble = Convert.ToDouble(planInfo.CompleteAmount);

                        ExecuteViewModel.isComplete = true;

                        // 使用 switch-case 来处理完成情况
                        switch (planAmountDouble.CompareTo(completeAmountDouble))
                        {
                            case 0: // 完成量等于计划量
                                planInfo.CompFlag = "0"; // 正常完成
                                break;
                            case int n when (n > 0): // 完成量小于计划量
                                planInfo.CompFlag = "1"; // 不足目标产量降级处理
                                break;
                            case int n when (n < 0): // 完成量大于计划量
                                planInfo.CompFlag = "2"; // 超额完成
                                break;
                        }

                        _prodPlanInfoService.Update(planInfo);
                        ExecuteViewModel.stations += 1;
                    }

                    // 关闭窗口
                    Application.Current.Windows.OfType<ProductionReportWin>().First().Close();
                     RefrashClearAction?.Invoke(0);
                }
            }
            else
            {
                MessageBox.Show("完成产量与计划数量差距过大！");
            }
        }


        /// <summary>
        /// 继续执行
        /// </summary>
        /// <exception cref="NotImplementedException"></exception>
        private void Continue()
        {
            //关闭窗口
            Application.Current.Windows.OfType<ProductionReportWin>().First().Close();
        }

        /// <summary>
        /// 暂停工单
        /// </summary>
        private void Pause()
        {
            //将当前的工单更新为待执行
            planInfo.PlanStatus = "4";
            _prodPlanInfoService.Update(planInfo);
            ExecuteViewModel.isComplete = true;
            //关闭窗口
            Application.Current.Windows.OfType<ProductionReportWin>().First().Close();
            RefrashClearAction?.Invoke(0);
        }


        /// <summary>
        /// 获取完成率
        /// </summary>
        /// <param name="complateAmount"></param>
        /// <param name="planAmount"></param>
        /// <returns></returns>
        private double GetComplateRate(double complateAmount, string planAmount)
        {
            double plan = Convert.ToDouble(planAmount);
            return complateAmount - plan;
        }

        public void OnPropertyChanged([CallerMemberName] string propertyName = "")
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}
