using AutoMapper;
using HandyControl.Data;
using LogoForceTestApp.Modules.MainModule.Models;
using Prism.Commands;
using Prism.Mvvm;
using Repository;
using Repository.Entiies;
using Serilog;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;

namespace LogoForceTestApp.Modules.MainModule.ViewModels
{
    internal class QualityTracingViewModel : BindableBase
    {
        public List<Information> InfNew { get; set; }
        private readonly IMapper _mapper;
        private readonly List<Information> _infNew;

        public int PageIndex { get; set; } = 1;
        public int MaxCount { get; set; } = 1;
        public int PageCount { get; set; } = 20;
        public DateTime SelectedStartDate { get; set; }
        public DateTime SelectedEndDate { get; set; }

        public DelegateCommand<FunctionEventArgs<int>> PageUpdatedCmd => new(PageUpdated);

        private readonly IRepository repository;

        public string OperatorCode { get; set; }
        public DelegateCommand QueryCommand { get; set; }

        #region 价钱
        public double P60_Price { get; set; }
        public double P70_Price { get; set; }
        public double P80_Price { get; set; }
        public double P90_Price { get; set; }
        public double T29_Price { get; set; }
        public double DH88_Price { get; set; }
        public double QL1_Price { get; set; }
        public double P60Num { get; set; }
        public double P70Num { get; set; }
        public double P80Num { get; set; }
        public double P90Num { get; set; }
        public double T29Num { get; set; }
        public double DH88Num { get; set; }
        public double QL1Num { get; set; }
        public double Money { get; set; }
        public DelegateCommand ShowMoneyCommand { get; set; }

        #endregion

        public QualityTracingViewModel(IMapper mapper, IRepository repository)
        {
            SelectedStartDate = DateTime.Today;
            SelectedEndDate = DateTime.Today;
            InfNew = new List<Information>();
            _infNew=new List<Information>();
            _mapper = mapper;
           
            //
            QueryCommand = new DelegateCommand(query);
            ShowMoneyCommand = new DelegateCommand(ShowMoney);
            this.repository = repository;
        }

        private void ShowMoney()
        {
            Money = P60_Price * P60Num + P70_Price * P70Num + P80_Price * P80Num + P90_Price * P90Num
                + T29_Price * T29Num + DH88_Price * DH88Num + QL1_Price * QL1Num;
        }

        /// <summary>
        /// 页码改变
        /// </summary>
        private void PageUpdated(FunctionEventArgs<int> info)
        {
            InfNew = _infNew.Skip((info.Info - 1) * PageCount).Take(PageCount).Reverse().ToList();
        }

        public double GeneralTime { get; set; }
        public int AllNumber { get; set; }

        private void query()
        {
            if (SelectedEndDate < SelectedStartDate || SelectedStartDate == default)
            {
                MessageBox.Show("请选择正确的日期", "提示");
                return;
            }

            _infNew.Clear();

            var endTime = SelectedEndDate.AddDays(1);
            var list = repository.GetAllQuery<Information>(c => c.OperatorCode == OperatorCode && c.CreateTime >= SelectedStartDate&& c.CreateTime <= endTime);
            GeneralTime = list.Sum(c => c.SpendTime);//个人生产总时间
            AllNumber = list.Count();//个人生产总量

            var res_60 = repository.GetAllQuery<Information>(c => c.ProType=="P60"&&c.OperatorCode == OperatorCode && c.CreateTime >= SelectedStartDate && c.CreateTime <= endTime);
            P60Num = res_60.Count();
            var res_70 = repository.GetAllQuery<Information>(c => c.ProType == "P70" && c.OperatorCode == OperatorCode && c.CreateTime >= SelectedStartDate && c.CreateTime <= endTime);
            P70Num = res_70.Count();
            var res_80 = repository.GetAllQuery<Information>(c => c.ProType == "P80" && c.OperatorCode == OperatorCode && c.CreateTime >= SelectedStartDate && c.CreateTime <= endTime);
            P80Num = res_80.Count();
            var res_90 = repository.GetAllQuery<Information>(c => c.ProType == "P90" && c.OperatorCode == OperatorCode && c.CreateTime >= SelectedStartDate && c.CreateTime <= endTime);
            P90Num = res_90.Count();
            var res_T29 = repository.GetAllQuery<Information>(c => c.ProType == "T29" && c.OperatorCode == OperatorCode && c.CreateTime >= SelectedStartDate && c.CreateTime <= endTime);
            T29Num = res_T29.Count();
            var res_DH88 = repository.GetAllQuery<Information>(c => c.ProType == "DH-88" && c.OperatorCode == OperatorCode && c.CreateTime >= SelectedStartDate && c.CreateTime <= endTime);
            DH88Num = res_DH88.Count();
            var res_QL1 = repository.GetAllQuery<Information>(c => c.ProType == "QL-1" && c.OperatorCode == OperatorCode && c.CreateTime >= SelectedStartDate && c.CreateTime <= endTime);
            QL1Num = res_QL1.Count();


            list.Reverse();
            var dtos = _mapper.Map<List<Information>>(list);
            _infNew.AddRange(dtos);


            InfNew = _infNew.Take(PageCount).ToList();
            MaxCount =_infNew.Count / PageCount + 1;
        }

        
    }
    

}