using GalaSoft.MvvmLight.Command;
using Microsoft.AspNetCore.Components.Forms;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.IdentityModel.Protocols;
using SlnMesnac.Business.business;
using SlnMesnac.Model.domain;
using SlnMesnac.Model.dto;
using SlnMesnac.Repository.service;
using SlnMesnac.WPF.Page;
using SlnMesnac.WPF.Views;
using SqlSugar;
using System;
using System.CodeDom.Compiler;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Configuration;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Documents;
using System.Windows.Input;

namespace SlnMesnac.WPF.ViewModel
{
    public class ExecuteViewModel : INotifyPropertyChanged
    {
        public ObservableCollection<string> OrderCodeComboBoxItems { get; set; }
        public ObservableCollection<string> PlanCodeComboBoxItems { get; set; }
        public ObservableCollection<string> MaterialNameComboBoxItems { get; set; }
        private RfidHandleBusniess _RfidHandleBusniess;
        private ProdPlanInfoService _prodPlanInfoService;
        private List<ProdPLanInfo> prodPlanInfos;
        private ProdPlanDetailService _prodPlanDetailService;
        private IRecordStaffAttendanceService _recordStaffAttendanceService;
        private IBaseStaffService _baseStaffService;
        private string StationCode;
        public static bool isComplete = true;
        private ProdPLanInfo pLanInfo;

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

        /// <summary>
        /// 检索命令
        /// </summary>
        public ICommand SearchCommand { get; private set; }

        /// <summary>
        /// 换班命令
        /// </summary>
        public ICommand HandoverCommand { get; private set; }

        /// <summary>
        /// 报工命令
        /// </summary>
        public ICommand ProductionReportCommand { get; private set; }

        /// <summary>
        /// 工艺信息命令
        /// </summary>
        public ICommand TechnologicalInformationCommand { get; private set; }

        /// <summary>
        /// 执行命令
        /// </summary>
        public ICommand ExecuteCommand { get; private set; }

        #region 委托
        public delegate void RefreshDelegate(ProdPLanInfo pLanInfo);
        public static event RefreshDelegate? RefreshEvent;
        #endregion

        public ExecuteViewModel()
        {
            _prodPlanInfoService = App.ServiceProvider.GetService<ProdPlanInfoService>();
            _prodPlanDetailService = App.ServiceProvider.GetService<ProdPlanDetailService>();
            _recordStaffAttendanceService = App.ServiceProvider.GetService<IRecordStaffAttendanceService>();
            _RfidHandleBusniess = App.ServiceProvider.GetService<RfidHandleBusniess>();
            _baseStaffService = App.ServiceProvider.GetService<IBaseStaffService>();
            IConfigurationBuilder configurationBuilder = new ConfigurationBuilder()
                .SetBasePath(System.AppContext.BaseDirectory)
                .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
            IConfigurationRoot configuration = configurationBuilder.Build();
            pLanInfo = _prodPlanInfoService.GetRecordStaffAttendancesByConditions("", "", "", "", "1").FirstOrDefault();
            Refresh(pLanInfo);
            // 从配置文件中获取ProductLineNameTextBlock的值
            stationTextBlock = configuration.GetSection("AppConfig")["ProductLineName"];
            StationCode = configuration.GetSection("AppConfig")["ProductLineCode"];
            HandoverCommand = new RelayCommand(Handover);
            ProductionReportCommand = new RelayCommand(ProductionReport);
            TechnologicalInformationCommand = new RelayCommand(TechnologicalInformation);
            SearchCommand = new RelayCommand(Search);
            ExecuteCommand = new RelayCommand(Execute);
            ProductionReportViewModel.RefreshDelegateEvent += Refresh;
            EmployeeLoginViewModel.TransmitUserDelegateEvent += ShowTeamMember;
        }

        /// <summary>
        /// 换班弹窗
        /// </summary>
        private void Handover()
        {
            var handOverWin = new HandOverWin();
            handOverWin.Owner = Application.Current.MainWindow;  //  设置父窗口为当前主窗口
            handOverWin.WindowStartupLocation = WindowStartupLocation.CenterScreen; // 让窗体出现在屏幕中央
            handOverWin.ShowDialog();//窗体出现后禁止后面的用户控件
            
        }

        /// <summary>
        /// 报工弹窗
        /// </summary>
        private void ProductionReport()
        {
            var reportWin = new ProductionReportWin();
            reportWin.Owner = Application.Current.MainWindow;  //  设置父窗口为当前主窗口
            reportWin.WindowStartupLocation = WindowStartupLocation.CenterScreen; // 让窗体出现在屏幕中央
            reportWin.ShowDialog();//窗体出现后禁止后面的用户控件
        }

        /// <summary>
        /// 工艺信息弹窗,单例模式保证只显示一个
        /// </summary>
        private static TechnologicalWin instance;
        private void TechnologicalInformation()
        {
            if (instance == null)
            {
                instance = new TechnologicalWin();
                instance.WindowStartupLocation = WindowStartupLocation.CenterScreen;
                instance.Closed += (sender, e) => { instance = null; }; // 窗口关闭时重置instance为null，以便下次可以重新打开窗口
                instance.Show();
            }
            else
            {
                instance.Focus(); // 如果窗口已经存在，则将焦点放在该窗口上
            }
        }


        /// <summary>
        /// 检索事件
        /// </summary>
        private void Search()
        {
            // 在这里执行其他操作，可以通过InputText获取用户输入的信息
            //Console.WriteLine("用户输入的信息：" + OrderCodeTextBox + PlanCodeTextBox + MaterialCodeTextBox);
            //ProductLineNameTextBlock = ConfigurationManager.AppSettings["ProductLineNameTextBlock"];
            List<ProdPLanInfo> list = _prodPlanInfoService.GetRecordStaffAttendancesByConditions(OrderCodeTextBox, PlanCodeTextBox, MaterialCodeTextBox, StationCode,"0");
            System.Windows.Application.Current.Dispatcher.Invoke((Action)(async () =>
            {
                ProdPLanInfoDataGrid.Clear();
                list.ForEach(item => 
                {
                    ProdPLanInfoDataGrid.Add(item);
                });
            }));
        }

        /// <summary>
        /// 新增的执行事件
        /// </summary>
        private void Execute()
        {
            //判断是否有班组当班,查询打卡记录表，4小时内最后一次打卡类型为上班的班组
            if(EmployeeLoginViewModel.isOnDuty == true)
            {
                if (isComplete)//判断是否完成，未完成不能执行其他工单
                {
                    // 将当前记录存为实体，可以通过parameter获取当前记录的信息
                    string orderCode = _selectedRow.OrderCode.ToString();
                    string planCode = _selectedRow.PlanCode.ToString();
                    pLanInfo = _prodPlanInfoService.GetRecordStaffAttendancesByConditions(orderCode, planCode, "", "", "0").First();
                    RecordStaffAttendance currentRecord = _recordStaffAttendanceService.GetLastestOnRecord();
                    BaseStaffInfo staffInfo = _baseStaffService.GetMonitorByTeamCode(currentRecord.TeamCode);
                    RecordStaffAttendance nextRecord = _recordStaffAttendanceService.GetLastestOffRecord();
                    // 向detail表里插入一条数据
                    ProdPlanDetail prodPlanDetail = new ProdPlanDetail
                    {
                        PlanCode = pLanInfo.PlanCode,
                        MaterialCode = pLanInfo.MaterialCode,
                        PlanAmount = pLanInfo.PlanAmount,
                        CompleteAmount = pLanInfo.CompleteAmount,
                        BeginTime = DateTime.Now.ToString(),
                        CurrentStaffId = staffInfo.StaffId
                        //NextStaffId = nextRecord.StaffId,
                    };
                    _prodPlanDetailService.Insert(prodPlanDetail);
                    //按钮文字变成执行中并锁定，其他的订单执行按钮也禁用
                    pLanInfo.BeginTime = DateTime.Now.ToString();
                    pLanInfo.PlanStatus = "1";
                    _prodPlanInfoService.Update(pLanInfo);
                    Search();
                    //查明细表显示出来
                    Refresh(pLanInfo);
                    isComplete = false;
                }
            }  
        }

        //刷新明细
        private void Refresh(ProdPLanInfo pLanInfo)
        {
            if(pLanInfo != null)
            {
                ProdPlanDetail planDetail = _prodPlanDetailService.GetPlanDetailsByPlanCode(pLanInfo.PlanCode);
                PlanCodeText = planDetail.PlanCode;
                OrderCodeText = pLanInfo.OrderCode;
                MaterialCodeText = planDetail.MaterialCode;
                StationCodeText = pLanInfo.StationCode;
                System.Windows.Application.Current.Dispatcher.Invoke((Action)(async () =>
                {
                    ProdPLanDetailDataGrid.Clear();
                    ProdPLanDetailDataGrid.Add(planDetail);
                }));
            }     
        }

        /// <summary>
        /// 显示班组成员
        /// </summary>
        /// <param name="baseStaffInfo"></param>
        private void ShowTeamMember(BaseStaffInfo baseStaffInfo)
        {
            if(baseStaffInfo != null)
            {
                TeamMember = _RfidHandleBusniess.SpliceTeamMember(baseStaffInfo);
            }
        }

        #region
        /// <summary>
        /// 班组成员
        /// </summary>
        private string teamMember;
        public string TeamMember
        {
            get { return teamMember; }
            set { teamMember = value; OnPropertyChanged("TeamMember"); }
        }

        /// <summary>
        /// 订单
        /// </summary>
        private string orderCodeTextBox;
        public string OrderCodeTextBox
        {
            get { return orderCodeTextBox; }
            set { orderCodeTextBox = value; OnPropertyChanged("OrderCodeTextBox"); }
        }

        /// <summary>
        /// 工单
        /// </summary>
        private string planCodeTextBox;
        public string PlanCodeTextBox
        {
            get { return planCodeTextBox; }
            set { planCodeTextBox = value; OnPropertyChanged("PlanCodeTextBox"); }
        }

        /// <summary>
        /// 原料
        /// </summary>
        private string materialCodeTextBox;
        public string MaterialCodeTextBox
        {
            get { return materialCodeTextBox; }
            set { materialCodeTextBox = value; OnPropertyChanged("MaterialNameTextBox"); }
        }

        /// <summary>
        /// 工位
        /// </summary>
        private string stationTextBlock;
        public string StationTextBox
        {
            get { return stationTextBlock; }
            set { stationTextBlock = value; new PropertyChangedEventArgs(nameof(StationTextBox)); }
        }

        /// <summary>
        /// PlanDataGrid
        /// </summary>
        private ObservableCollection<ProdPLanInfo> prodPLanInfoDataGrid = new ObservableCollection<ProdPLanInfo>();
        public ObservableCollection<ProdPLanInfo> ProdPLanInfoDataGrid
        {
            get { return prodPLanInfoDataGrid; }
            set { prodPLanInfoDataGrid = value; OnPropertyChanged("ProdPLanInfoDataGrid"); }
        }

        /// <summary>
        /// DetailDataGrid
        /// </summary>
        private ObservableCollection<ProdPlanDetail> prodPLanDetailDataGrid = new ObservableCollection<ProdPlanDetail>();
        public ObservableCollection<ProdPlanDetail> ProdPLanDetailDataGrid
        {
            get { return prodPLanDetailDataGrid; }
            set { ProdPLanDetailDataGrid = value; OnPropertyChanged("ProdPLanDetailDataGrid"); }
        }

        /// <summary>
        /// 选中行
        /// </summary>
        public ProdPLanInfo _selectedRow;
        public ProdPLanInfo SelectedRow
        {
            get { return _selectedRow; }
            set
            {
                _selectedRow = value; OnPropertyChanged(nameof(SelectedRow));
            }
        }

        /// <summary>
        /// 订单Text
        /// </summary>
        private string orderCodeText;
        public string OrderCodeText
        {
            get { return orderCodeText; }
            set { orderCodeText = value; OnPropertyChanged("OrderCodeText"); }
        }

        /// <summary>
        /// 工单Text
        /// </summary>
        private string planCodeText;
        public string PlanCodeText
        {
            get { return planCodeText; }
            set { planCodeText = value; OnPropertyChanged("PlanCodeText"); }
        }

        /// <summary>
        /// 原料Text
        /// </summary>
        private string materialCodeText;
        public string MaterialCodeText
        {
            get { return materialCodeText; }
            set { materialCodeText = value; OnPropertyChanged("MaterialCodeText"); }
        }

        /// <summary>
        /// 订单
        /// </summary>
        private string stationCodeText;
        public string StationCodeText
        {
            get { return stationCodeText; }
            set { stationCodeText = value; OnPropertyChanged("StationCodeText"); }
        }
        #endregion

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