using Admin.Core.Common;
using Admin.Core.IService;
using Admin.Core.Model;
using Aucma.Core.Palletiz.Business;
using Aucma.Core.Palletiz.Models;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using Elasticsearch.Net;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Documents;

namespace Aucma.Core.Palletiz.ViewModels
{
    public partial class StatisticsPageViewModel : ObservableObject
    {


        /// <summary>
        /// 入库数量统计
        /// </summary>
        public delegate void CountInstore(int count);
        public static event CountInstore? CountInstoreEvent;



        // private static readonly Lazy<StatisticsPageViewModel> lazy = new Lazy<StatisticsPageViewModel>(() => new StatisticsPageViewModel());
        //  public static StatisticsPageViewModel Instance => lazy.Value;
        public StatisticsPageViewModel()
        {
            MainWindowViewModel.RefreshInfoEvent += LoadData;
            InStoreBusiness.AddDataEvent += AddData;
            LoadData();
        }
        private readonly IRecordInStoreServices? _recordInstoreServices = App.ServiceProvider.GetService<IRecordInStoreServices>();
        List<MaterialComplateInfo> materialComplateInfos = new List<MaterialComplateInfo>();
        public string storeCodeA = Appsettings.app("StoreInfo", "PalletizStoreCodeA");

        public string storeCodeB = Appsettings.app("StoreInfo", "PalletizStoreCodeB");


        /// <summary>
        /// 入库时DataGrid添加一条记录
        /// </summary>
        /// <returns></returns>
        public void AddData(RecordInStore record)
        {
            LoadData();
        }

        #region 加载DataGrid数据
        private async Task LoadData()
        {
            await Task.Run(() =>
              {
                  try
                  {

                      List<RecordInStore> list = _recordInstoreServices.QueryAsync(x => (x.StoreCode == storeCodeA) && x.InStoreTime >= DateTime.Today).Result;
                      if (list != null && list.Count > 0)
                      {
                          App.Current.Dispatcher.Invoke(() =>
                          {
                              MaterialDataGrid.Clear();
                              CountInstoreEvent?.Invoke(list.Count);
                              list.OrderByDescending(x => x.InStoreTime);
                              foreach (RecordInStore record in list)
                              {

                                  MaterialDataGrid.Add(record);

                              }
                          });
                      }
                  }
                  catch (Exception ex)
                  {
                      Console.WriteLine("" + ex.Message.ToString());

                  }
              });


            //MaterialDataGrid.Add(new MaterialComplateInfo() { No = 1, ProductPlanCode = "8659452123",MaterialCode = "8659452123", MaterialName = "SC-AUCMA-农夫山泉,SC", PlanAmount = 50, CompleteAmount = 10 });
        }

        #endregion

        #region 初始化datagrid
        private ObservableCollection<RecordInStore> materialDataGrid = new ObservableCollection<RecordInStore>();
        public ObservableCollection<RecordInStore> MaterialDataGrid
        {
            get { return materialDataGrid; }
            set
            {
                materialDataGrid = value;
                OnPropertyChanged();//属性通知
            }
        }
        #endregion

        #region 查询
        /// <summary>
        /// 查询
        /// </summary>
        [RelayCommand]
        private async Task ExecQuery(object obj)
        {
            List<RecordInStore> list = null;
            await Task.Run(() =>
            {

                string result = (string)obj;
                if(string.IsNullOrEmpty(result))
                {
                    list = _recordInstoreServices.QueryAsync(x => (x.StoreCode == storeCodeA || x.StoreCode == storeCodeB) && x.InStoreTime >= DateTime.Today).Result;
                }
                else
                {
                    list = _recordInstoreServices.QueryAsync(x => (x.StoreCode == storeCodeA || x.StoreCode == storeCodeB) && x.BarCodeCode.Contains(result)).Result;

                }
                if (list != null && list.Count > 0)
                {
                    App.Current.Dispatcher.Invoke(() =>
                    {
                        MaterialDataGrid.Clear();
                        foreach (RecordInStore record in list)
                        {
                            MaterialDataGrid.Add(record);
                        }
                    });
                }
            });
        }
        #endregion 
    }
}