using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using Admin.Core.IService;
using log4net;
using Microsoft.Extensions.DependencyInjection;
using Admin.Core.Model;
using Castle.Core.Internal;
using CommunityToolkit.Mvvm.Messaging;
using Admin.Core.Common;
using Aucma.Core.Palletiz.Common;
using Aucma.Core.Palletiz.Models;
using Aucma.Core.Palletiz.Views;

namespace Aucma.Core.Palletiz.ViewModels
{
    public partial class SplitPlanViewModel : ObservableObject
    {
        private static readonly log4net.ILog log = LogManager.GetLogger(typeof(SplitPlanViewModel));

        protected readonly IProductPlanInfoServices? _productPlanInfoServices;
        protected readonly IExecutePlanInfoServices? _executePlanInfoServices;
        private AppConfigHelper appConfig = new AppConfigHelper();//读取配置文件保存的查询内容

        #region 构造函数
        public SplitPlanViewModel()
        {
            _productPlanInfoServices = App.ServiceProvider.GetService<IProductPlanInfoServices>();
            _executePlanInfoServices = App.ServiceProvider.GetService<IExecutePlanInfoServices>();
            Task.WaitAll(LoadData());
            //加载快捷方式
            SaveSearchCriteria();
            WeakReferenceMessenger.Default.Register<string>(this, SaveSearchCriteria);
            _radioButtonStatus = 1;
        }
        #endregion

        #region 加载DataGrid数据
        private async Task LoadData()
        {
            try
            {
                MaterialDataGrid.Clear();
                int i = 1;
                string station = Appsettings.app("StationInfo", "StationCode");
                var execList = _executePlanInfoServices.QuerySheetMetalPlanData(station);
                if (execList == null) return;
                foreach (var item in execList)
                {
                    int residue = 0;
                    if (execList == null) residue = 0;
                    else residue = (execList.Where(d => d.MaterialCode.Equals(item.MaterialCode))).Sum(d => d.PlanAmount);
                    MaterialDataGrid.Add(new ProductPlanInfoModel()
                    {
                        No = i,
                        PlanCode = item.PlanCode,
                        OrderCode = item.OrderCode,
                        MaterialCode = item.MaterialCode,
                        MaterialName = item.MaterialName,
                        PlanAmount = item.PlanAmount,
                        ResidueAmount = item.PlanAmount - item.CompleteAmount,
                        SpliteResidueAmount = item.PlanAmount - residue,
                        MaterialSpecificatons = item.MaterialSpecificatons,
                        CompleteAmount = item.CompleteAmount,
                        StartDate = item.BeginTime
                    });
                    i++;
                }

            }
            catch (Exception ex)
            {
                log.Error($"初始化查询:{ex.Message}");
            }
            await Task.CompletedTask;
        }

        private async Task LoadData(string obj)
        {
            try
            {
                string station = Appsettings.app("StationInfo", "StationCode");
                MaterialDataGrid.Clear();
                int i = 1;
                var execList = _executePlanInfoServices.QuerySheetMetalPlanData(station);
                if (execList == null) return;
                execList = execList.Where(d => d.MaterialName.Contains(obj) || d.OrderCode.Contains(obj) || d.PlanCode.Contains(obj)).ToList();
                foreach (var item in execList)
                {
                    int residue = 0;
                    if (execList == null) residue = 0;
                    else residue = (execList.Where(d => d.MaterialCode.Equals(item.MaterialCode))).Sum(d => d.PlanAmount);
                    MaterialDataGrid.Add(new ProductPlanInfoModel()
                    {
                        No = i,
                        PlanCode = item.PlanCode,
                        MaterialCode = item.MaterialCode,
                        MaterialName = item.MaterialName,
                        OrderCode = item.OrderCode,
                        PlanAmount = item.PlanAmount,
                        ResidueAmount = item.PlanAmount - item.CompleteAmount,
                        SpliteResidueAmount = item.PlanAmount - residue,
                        MaterialSpecificatons = item.MaterialSpecificatons,
                        StartDate = item.BeginTime
                    });
                    i++;
                }
            }
            catch (Exception ex)
            {
                log.Error($"根据搜索条件查询:{ex.Message}");
            }
            await Task.CompletedTask;
        }
        #endregion

        #region 初始化datagrid
        private ObservableCollection<ProductPlanInfoModel> materialDataGrid = new ObservableCollection<ProductPlanInfoModel>();
        public ObservableCollection<ProductPlanInfoModel> MaterialDataGrid
        {
            get => materialDataGrid;
            set => SetProperty(ref materialDataGrid, value);
        }
        #endregion

        #region 查询
        /// <summary>
        /// 查询
        /// </summary>
        [RelayCommand]
        private async Task QueryPlan(string obj)
        {
            if (obj.IsNullOrEmpty())
            {
                System.Windows.Application.Current.Dispatcher.Invoke((Action)(async () =>
                {
                    MaterialDataGrid.Clear();
                    await LoadData();
                }));
                return;
            }
            MaterialDataGrid.Clear();
            await LoadData(obj);
        }
        #endregion

        #region 创建任务
        /// <summary>
        /// 创建任务
        /// </summary>
        private async Task CreateTask(string obj)
        {
            if (string.IsNullOrEmpty(obj))
            {
                MessageBox.Show("请选中需要拆分的计划!", "系统提醒");
                return;
            }
            ExecutePlanInfo task = new ExecutePlanInfo();
            var list = await _executePlanInfoServices.QueryAsync(d => d.ProductLineCode.Equals("1001"));

            string stationCode = Appsettings.app("StationInfo", "StationCode");
            string plan_code = SelectedCells.PlanCode;
            string order_code = SelectedCells.OrderCode;
            string material_code = SelectedCells.MaterialCode;
            string material_name = SelectedCells.MaterialName;
            int plan_amount = SelectedCells.PlanAmount;

            task.TaskCode = GetMaxNum(plan_code);
            task.ExecutePlanCode = Guid.NewGuid().ToString().Substring(0, 16);
            task.ProductPlanCode = plan_code;
            task.OrderCode = order_code;
            task.MaterialCode = material_code;
            task.MaterialName = material_name;
            task.ProductLineCode = stationCode;//计划工位
            if (list.Count == 0)
                task.ExecuteOrder = 1;
            if (list.Count != 0)
                task.ExecuteOrder = list.Max(d => d.ExecuteOrder) + 1;

            task.ExecuteMethod = 1;//不做要求,系统自动确定
            task.ExecuteStatus = 1;
            task.PlanAmount = SelectedCells.SpliteResidueAmount;
            task.CompleteAmount = 0;
            task.CreatedTime = DateTime.Now;

            var result = await _executePlanInfoServices.AddAsync(task);
            if (result > 0)
            {
                MessageBox.Show("计划拆分成功!", "系统提醒");
                //WeakReferenceMessenger.Default.Send<string>("Refresh");//刷新窗口
            }
            else
            {
                MessageBox.Show("计划拆分失败,请检查后重试!", "系统提醒");
            }
        }
        #endregion

        #region 获取当前行数据 赋值到textbox
        private ProductPlanInfoModel selectedCells;
        public ProductPlanInfoModel SelectedCells
        {
            get { return selectedCells; }
            set
            {
                selectedCells = value;
                SetProperty(ref selectedCells, value);
            }
        }
        #endregion

        #region 关闭当前窗口
        /// <summary>
        /// 关闭当前窗口
        /// </summary>
        public void CloseWindow()
        {
            WeakReferenceMessenger.Default.Send<object>("close");
        }
        #endregion

        #region 参数定义

        private string _search = string.Empty;
        public string Search
        {
            get => _search;
            set => SetProperty(ref _search, value);
        }
        /// <summary>
        /// 下拉框
        /// </summary>
        public string _materialTypeCombox;
        public string MaterialTypeCombox
        {
            get => _materialTypeCombox;
            set => SetProperty(ref _materialTypeCombox, value);
        }

        #region 多选按钮
        /// <summary>
        /// 多选按钮
        /// </summary>
        public int _radioButtonStatus;
        public int RadioButtonStatus
        {
            get => _radioButtonStatus;
            set => SetProperty(ref _radioButtonStatus, value);
        }
        #endregion

        private ObservableCollection<string> _configurations = new ObservableCollection<string>();
        public ObservableCollection<string> Configurations
        {
            get => _configurations;
            set => SetProperty(ref _configurations, value);
        }

        private ProductPlanInfoModel selectedDataItem;
        public ProductPlanInfoModel SelectedDataItem
        {
            get => selectedDataItem;
            set => SetProperty(ref selectedDataItem, value);
        }
        #endregion

        #region 重置
        /// <summary>
        /// 重置
        /// </summary>
        [RelayCommand]
        public async Task Reset()
        {
            Search = string.Empty;
            MaterialTypeCombox = string.Empty;
            await this.LoadData();
        }
        #endregion

        #region 搜索条件设置
        /// <summary>
        /// 搜索条件设置
        /// </summary>
        [RelayCommand]
        public async Task SearchCriteriaSet()
        {
            SearchCriteriaView searchCriteriaWindow = new SearchCriteriaView();
            bool? dialogResult = searchCriteriaWindow.ShowDialog();
            if (dialogResult == false) // 用户点击了“取消”按钮或关闭窗口
            {
                await LoadData();
            }
        }
        #endregion

        #region 查询快捷查询方式

        private void SaveSearchCriteria(object recipient, string message)
        {
            if (message == "RefreshSearchItems")
            {
                Configurations = new ObservableCollection<string>();
                var searchItems = appConfig.searchItems;
                var split = searchItems.Split('%');

                foreach (var item in split)
                {
                    if (!string.IsNullOrEmpty(item))
                    {
                        Configurations.Add(item);
                    }
                }
            }

        }
        private void SaveSearchCriteria()
        {
            Configurations = new ObservableCollection<string>();
            var searchItems = appConfig.searchItems;
            var split = searchItems.Split('%');

            foreach (var item in split)
            {
                if (!string.IsNullOrEmpty(item))
                {
                    Configurations.Add(item);
                }
            }
        }
        #endregion

        #region 双击事件
        public void MouseClick(object obj)
        {
            var info = SelectedDataItem as ProductPlanInfoModel;
            if (info != null)
            {
                info.PlanType = _radioButtonStatus;
                //QuantityIssuedView quantityIssuedWindow = new QuantityIssuedView(info);
                //quantityIssuedWindow.ShowDialog();
            }
        }

        /// <summary>
        /// 鼠标双击事件
        /// </summary>
        [RelayCommand]
        public void DoubleMouseClick()
        {
            MessageBox.Show("双击事件");
        }
        #endregion

        #region 快捷查询
        /// <summary>
        /// 快捷查询
        /// </summary>
        /// <param name="selectedOption"></param>
        /// <returns></returns>
        [RelayCommand]
        public async Task RadioButton(string selectedOption)
        {
            string productLineCode = Appsettings.app("StationInfo", "StationCode");
            MaterialDataGrid.Clear();
            if (!string.IsNullOrEmpty(selectedOption))
            {
                await LoadData(selectedOption);
            }
            else
            {
                await LoadData();
            }

        }

        #endregion

        #region 按钮
        /// <summary>
        /// 按钮
        /// </summary>
        /// <returns></returns>
        [RelayCommand]
        public void UpdateRadioButtonStatus(string status)
        {
            if (status == "status1")
            {
                _radioButtonStatus = 1;
            }
            if (status == "status2")
            {
                _radioButtonStatus = 2;
            }
            if (status == "status3")
            {
                _radioButtonStatus = 3;
            }
        }
        #endregion

        #region 获取最大值
        /// <summary>
        /// 获取最大值
        /// </summary>
        /// <param name="taskCode">MES编码</param>
        /// <returns></returns>
        public string GetMaxNum(string mesId)
        {
            try
            {
                List<int> tempList = new List<int>();
                var list = _executePlanInfoServices.QueryAsync(d => d.TaskCode.Contains(mesId)).Result;
                if (list.Count() == 0)
                {
                    return mesId + "0001";
                }
                foreach (var item in list)
                {
                    string code = item.TaskCode.Substring(item.TaskCode.Length - 4);
                    int num = Convert.ToInt32(code);
                    tempList.Add(num);
                }
                string maxStr = (tempList.Max() + 1).ToString();
                string taskCode = maxStr.PadLeft(4, '0');
                return taskCode;
            }
            catch
            {
                return mesId + "0001";
            }
        }
        #endregion
    }
}