using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using Aucma.Core.SheetMetal.Models;
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 Aucma.Core.SheetMetal.Views;
using Aucma.Core.SheetMetal.Common;
using System.Windows.Input;
using Admin.Core.Common;
using System.Drawing.Drawing2D;

namespace Aucma.Core.SheetMetal.ViewModels
{
    public partial class SplitPlanViewModel : ObservableObject
    {
        private static readonly log4net.ILog log = LogManager.GetLogger(typeof(SplitPlanViewModel));
        protected readonly IProductPlanInfoServices? _productPlanInfoServices;
        //protected readonly ISmTaskExecutionServices? _smTaskExecutionServices;
        protected readonly IExecutePlanInfoServices? _executePlanInfoServices;
        private AppConfigHelper appConfig = new AppConfigHelper();

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

        #region 加载DataGrid数据
        private async Task LoadData()
        {
            MaterialDataGrid.Clear();
            int i = 1;
            string station = Appsettings.app("StoreInfo", "StationCode");
            var planlist = await _productPlanInfoServices.QueryAsync(d => d.ProductLineCode.Equals(station));
            var execList = await _executePlanInfoServices.QueryAsync(d => d.ProductLineCode.Equals(station));
            foreach (var item in planlist)
            {
                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,
                    StartDate = item.BeginTime
                });
                i++;
            }
        }
        
        private async Task LoadData(string obj)
        {
            int i = 1;
            string station = Appsettings.app("StoreInfo", "StationCode");
            var planlist = await _productPlanInfoServices.QueryAsync(d => d.ProductLineCode.Equals(station));
            var queryList = planlist.Where(d=>d.OrderCode.Contains(obj)|| d.MaterialCode.Contains(obj) || d.MaterialName.Contains(obj));
            var execList = await _executePlanInfoServices.QueryAsync(d => d.ProductLineCode.Equals(station));
            foreach (var item in queryList)
            {
                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,
                    StartDate = item.BeginTime
                });
                i++;
            }
        }
        #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>
        [RelayCommand]
        private async Task CreateTask(string obj)
        {
            if (string.IsNullOrEmpty(obj))
            {
                MessageBox.Show("请选中需要拆分的计划!", "系统提醒");
                return;
            }
            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;

            var list = await _executePlanInfoServices.QueryAsync(d=>d.ProductLineCode.Equals("1001"));
            ExecutePlanInfo task=new ExecutePlanInfo();
            task.ExecutePlanCode = Guid.NewGuid().ToString();
            task.ProductPlanCode = plan_code;
            task.OrderCode = order_code;
            task.MaterialCode = material_code;
            task.MaterialName = material_name;
            task.ProductLineCode = "1001";//计划工位
            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");//刷新窗口
                CloseWindow();
            }
            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 void Reset()
        {
            LoadData();

            Search = string.Empty;
            MaterialTypeCombox = string.Empty;
            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("StoreInfo", "ProductLineCode");
            List<ProductPlanInfo> planInfos = await _productPlanInfoServices.QueryAsync(d => d.ProductLineCode.Equals(productLineCode) && d.MaterialName.Contains(selectedOption));
            if (planInfos != null)
            {
                if (planInfos.Count > 0)
                {
                    MaterialDataGrid.Clear();
                    int i = 1;

                    var execList = await _executePlanInfoServices.QueryAsync(d => d.ProductLineCode.Equals(productLineCode));
                    foreach (var item in planInfos)
                    {
                        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,
                            StartDate = item.BeginTime
                        });
                        i++;
                    }
                }
            }
        }

        #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
    }
}