using GalaSoft.MvvmLight.Command;
using Microsoft.Extensions.DependencyInjection;
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 ProdPLanInfo planInfo;
        private ProdPlanDetail planDetail;

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

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

        public ProductionReportViewModel()
        {
            _prodPlanDetailService = App.ServiceProvider.GetService<ProdPlanDetailService>();
            _prodPlanInfoService = App.ServiceProvider.GetService<ProdPlanInfoService>();
            ConfirmCommand = new RelayCommand(Confirm);
            EndPlanCommand = new RelayCommand(EndPlan);
            Init();
        }

        private void Init()
        {
            planInfo = _prodPlanInfoService.GetRecordStaffAttendancesByConditions("", "", "", "","1").FirstOrDefault();
            Refresh();
        }

        private void Refresh()
        {
            if (planInfo != null)
            {
                planDetail = _prodPlanDetailService.GetPlanDetailsByPlanCode(planInfo.PlanCode);
                PlanAmountText = planDetail.PlanAmount.ToString();
                CompleteAmountText = planDetail.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"); }
        }
        #endregion

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

        /// <summary>
        /// 确认事件
        /// </summary>
        private void Confirm()
        {
            if(EmployeeLoginViewModel.isOnDuty == true)//是否有班组当班，无当班时操作无效
            {
                string newAmount = NewAmountText;
                if (newAmount != null)
                {
                    bool isNum = true;
                    foreach (char x in newAmount)
                    {
                        if (!char.IsNumber(x) && x != '.')
                        {
                            isNum = false;
                        }
                    }
                    if (isNum)
                    {
                        //将新增产量加到实际产量中
                        double currentAmountDouble = Convert.ToDouble(planDetail.CompleteAmount);
                        double newAmountDouble = Convert.ToDouble(newAmount);
                        double result = currentAmountDouble + newAmountDouble;
                        planDetail.CompleteAmount = result.ToString();
                        planInfo.CompleteAmount = result.ToString();
                        _prodPlanDetailService.Update(planDetail);
                        _prodPlanInfoService.Update(planInfo);
                        Refresh();
                        NewAmountText = null;
                        HintText = "已提交！";
                        RefreshDelegateEvent?.Invoke(planInfo);
                        ExecuteViewModel.isComplete = true;
                    }
                    else
                    {
                        //提示框提示错误信息
                        HintText = "输入有误，请输入阿拉伯数字！";
                    }
                }
                else
                {
                    HintText = "不能为空！";
                }
            }            
        }

        /// <summary>
        /// 结束工单命令
        /// </summary>
        public ICommand EndPlanCommand { get; private set; }
        private void EndPlan()
        {
            //判断工单实际产量与目标产量的差距，满足才能执行结束
            if(EmployeeLoginViewModel.isOnDuty == true)//是否有班组当班，无当班时操作无效
            {
                if (planDetail != null && planInfo != null)
                {
                    planDetail.EndTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                    _prodPlanDetailService.Update(planDetail);
                    planInfo.PlanStatus = "2";
                    planInfo.EndTime = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                    double planAmountDouble = Convert.ToDouble(planDetail.PlanAmount);
                    double completeAmountDouble = Convert.ToDouble(planDetail.CompleteAmount);
                    if (planAmountDouble == completeAmountDouble)
                    {
                        planInfo.CompFlag = "0";//正常完成
                    }
                    else if (planAmountDouble > completeAmountDouble)
                    {
                        planInfo.CompFlag = "1";//不足目标产量降级处理
                    }
                    else
                    {
                        planInfo.CompFlag = "2";//超额完成
                    }
                    _prodPlanInfoService.Update(planInfo);
                }
                //关闭窗口
                Application.Current.Windows.OfType<ProductionReportWin>().First().Close();
            }            
        }

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