using Admin.Core.Common;
using Admin.Core.IService;
using Admin.Core.Model;
using Admin.Core.Service;
using Aucma.Core.HwPLc;
using Aucma.Core.SheetMetal.Models;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using CommunityToolkit.Mvvm.Messaging;
using log4net;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.IdentityModel.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;

namespace Aucma.Core.SheetMetal.ViewModels
{
    public partial class QuantityIssuedViewModel : ObservableObject
    {
        private static readonly log4net.ILog logHelper = LogManager.GetLogger(typeof(QuantityIssuedViewModel));
        private IBaseBomInfoServices _bomInfoServices;
        private IBaseSpaceDetailServices _spaceDetailServices;
        protected readonly IExecutePlanInfoServices? _executePlanInfoServices;

        #region 构造函数
        public QuantityIssuedViewModel(ProductPlanInfoModel productPlanInfo)
        {
            _bomInfoServices = App.ServiceProvider.GetService<IBaseBomInfoServices>();
            _spaceDetailServices = App.ServiceProvider.GetService<IBaseSpaceDetailServices>();
            _executePlanInfoServices = App.ServiceProvider.GetService<IExecutePlanInfoServices>();

            PlanInfo = productPlanInfo;
        } 
        #endregion

        #region 属性
        private ProductPlanInfoModel _PlanInfo = new ProductPlanInfoModel();
        public ProductPlanInfoModel PlanInfo
        {
            get => _PlanInfo;
            set => SetProperty(ref _PlanInfo, value);
        }
        private string _TransmitAmount = string.Empty;
        public string TransmitAmount
        {
            get => _TransmitAmount;
            set => SetProperty(ref _TransmitAmount, value);
        }
        #endregion

        #region 下传计划
        /// <summary>
        /// 下传计划
        /// </summary>
        [RelayCommand]
        private async Task PlanInfoTransmit()
        {
            var productPlanInfo = _PlanInfo;
            if (productPlanInfo != null)
            {
                //下传到PLC
                string stationCode = Appsettings.app("StoreInfo", "StationCode");
                var list = await _executePlanInfoServices.QueryAsync(d => d.ProductLineCode.Equals(stationCode));
                if (list==null)
                {
                    MessageBox.Show("未查询到计划!", "系统提醒");
                    return;
                }
                ExecutePlanInfo task = new ExecutePlanInfo();
                task.ExecutePlanCode = Guid.NewGuid().ToString();
                task.ProductPlanCode = PlanInfo.PlanCode;
                task.OrderCode = PlanInfo.OrderCode;
                task.MaterialCode = PlanInfo.MaterialCode;
                task.MaterialName = PlanInfo.MaterialName;
                task.ProductLineCode = stationCode;//计划工位
                if (list.Count == 0)
                    task.ExecuteOrder = 1;
                if (list.Count != 0)
                    task.ExecuteOrder = list.Max(d => d.ExecuteOrder) + 1;

                task.ExecuteMethod = 2;//不做要求,系统自动确定
                task.PlanAmount = Convert.ToInt32(TransmitAmount);
                task.CompleteAmount = 0;
                task.CreatedTime = DateTime.Now;
                task.PlanType= productPlanInfo.PlanType;
                task.BeginTime = DateTime.Now;
                task.TaskCode = GetMaxCodeAsync();
                var exec= await _executePlanInfoServices.FirstAsync(d=>d.ExecuteStatus==2&& d.ProductLineCode.Equals(stationCode));
                if (exec==null)
                    task.ExecuteStatus = 2;
                else
                    task.ExecuteStatus = 1;

                var result = await _executePlanInfoServices.AddAsync(task);
                if (result > 0)
                {
                    var obj = PlcHelper.melsecList.FirstOrDefault(d => d.EquipName.Equals("OldTypePlc1"));
                    if (obj == null) { return; }
                    if (obj.plc.IsConnected)
                    {
                        obj.plc.WriteInt16("D8000", _TransmitAmount);//计划编号
                        obj.plc.WriteInt16("D8009", _TransmitAmount);//计划编号
                        obj.plc.WriteInt16("D8050", _TransmitAmount);//计划数量
                        obj.plc.ReadInt16("D8021");//应答字
                    }
                    MessageBox.Show("计划拆分成功!", "系统提醒");
                    WeakReferenceMessenger.Default.Send<string>("Refresh");//刷新窗口
                }
                else
                {
                    MessageBox.Show("计划拆分失败,请检查后重试!", "系统提醒");
                }
                //拆分计划到任务表中

                //bool result = PlanTransmitByProductPlan(_PlanInfo.PlanCode, Convert.ToInt32(_TransmitAmount));
                //if (result)
                //{
                //    MessageBox.Show("执行计划维护成功", "提示", MessageBoxButton.OK, MessageBoxImage.Information, MessageBoxResult.OK, MessageBoxOptions.DefaultDesktopOnly);
                //}
            }
            else
            {
                MessageBox.Show("生产计划获取失败,加载为空", "提示", MessageBoxButton.OK, MessageBoxImage.Error, MessageBoxResult.OK, MessageBoxOptions.DefaultDesktopOnly);
                return;
            }
        }

        #endregion

        #region 清除
        /// <summary>
        /// 清除
        /// </summary>
        [RelayCommand]
        private void ClearTransmitAmount()
        {
            string amount = _TransmitAmount.ToString();
            if (amount.Length > 0)
            {
                TransmitAmount = amount.Substring(0, amount.Length - 1);
            }
        }
        #endregion

        #region KeypadButton
        [RelayCommand]
        private void KeypadButton(object obj)
        {
            var info = obj as string;

            TransmitAmount += info;
        }
        #endregion

        #region 关闭
        /// <summary>
        /// 关闭
        /// </summary>
        /// <param name="parameter"></param>
        [RelayCommand]
        private void CloseWindow(object parameter)
        {
            var window = parameter as Window;
            if (window != null)
            {
                window.Close();
            }
        }
        #endregion

        public string GetMaxCodeAsync()
        {
            string stationCode = Appsettings.app("StoreInfo", "StationCode");
            string today = DateTime.Now.ToString("yyyyMMdd");
            var maxCode = _executePlanInfoServices.QueryAsync(d => d.ProductLineCode.Equals(stationCode)).Result.Max(d=>d.TaskCode);
            if (maxCode.IsNotEmptyOrNull())
            {
              string date=  maxCode.Substring(0, 8);
              string max = maxCode.Substring(maxCode.Length-4, maxCode.Length);
               
                if (today.Equals(date)) {
                    return date + (int.Parse(max) + 1);
                }
                else
                {
                    return today + "00001";
                }
            }
            else
            {
                return today + "00001";
            }
        }
    }
}