using HandyControl.Controls;
using HKCardOUT.Helper;
using HKCardOUT.Logic.Model;
using HKControl;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using XExten.Advance.LinqFramework;

namespace HKCardOUT.Logic.Service
{
    public class HKCore
    {
        List<SaleLog> Commom(SaleLog input) 
        {
            if (!DataBus.IsTest)
                if (!Main.GetInstance.GetIsSwipe(input.Location.AsInt())) return null;
            var Old = DbContext.Context.Queryable<SaleLog>()
                .Where(t => t.CardNo == input.CardNo)
                .Where(t => t.CreateTime.Year == DateTime.Now.Year)
                .Where(t => t.CreateTime.Month == DateTime.Now.Month)
                .Where(t => t.CreateTime.Day == DateTime.Now.Day).ToList();
            if (Old.Count > 3) return null;
            return Old;
        }
        /// <summary>
        /// 早上消费
        /// </summary>
        /// <param name="input"></param>
        /// <param name="Old"></param>
        /// <returns></returns>
        public bool DeviceSaleAM(SaleLog input)
        {
            try
            {
                var Old = Commom(input);
                if (Old == null) return false;
                var AM = DataBus.AM.Split(",").Select(t => t.AsInt()).ToList();
                var AMDay = Old.Where(t => t.CreateTime.Hour >= AM[0] && t.CreateTime.Hour < AM[1])
                    .Where(t => t.CreateTime.Year == DateTime.Now.Year)
                    .Where(t => t.CreateTime.Month == DateTime.Now.Month)
                    .Where(t => t.CreateTime.Day == DateTime.Now.Day)
                    .Count();
                HKLog.HKLogImport.WriteInfo($"卡号{input.CardNo}上午消费次数：{AMDay}");

                if (AMDay < 1)
                {
                    var entity = DbContext.Context.Insertable(input).CallEntityMethod(t => t.Create()).ExecuteReturnEntity();
                    if (entity.Id != Guid.Empty)
                    {
                        var res = RemoteService.SyncSaleLog(input.CardNo, input.Location);
                        if (!DataBus.IsTest)
                            Main.GetInstance.Start(input.Location.AsInt());
                        DbContext.Context.Updateable<SaleLog>().SetColumns(t => t.IsSync == true).Where(t => t.Id == entity.Id).ExecuteCommand();
                        return res;
                    }
                }
                return false;
            }
            catch (Exception ex)
            {
                HKLog.HKLogImport.WriteError(ex);
                return false;
            }

        }
        /// <summary>
        /// 中午消费
        /// </summary>
        /// <param name="input"></param>
        /// <param name="Old"></param>
        /// <returns></returns>
        public bool DeviceSalePM(SaleLog input)
        {
            try
            {
                var Old = Commom(input);
                if (Old == null) return false;
                var PM = DataBus.PM.Split(",").Select(t => t.AsInt()).ToList();
                var PMDay = Old.Where(t => t.CreateTime.Hour >= PM[0] && t.CreateTime.Hour < PM[1]).
                      Where(t => t.CreateTime.Year == DateTime.Now.Year)
                      .Where(t => t.CreateTime.Month == DateTime.Now.Month)
                      .Where(t => t.CreateTime.Day == DateTime.Now.Day)
                      .Count();
                HKLog.HKLogImport.WriteInfo($"卡号{input.CardNo}中午消费次数：{PMDay}");
                if (PMDay < 1)
                {
                    var entity = DbContext.Context.Insertable(input).CallEntityMethod(t => t.Create()).ExecuteReturnEntity();
                    if (entity.Id != Guid.Empty)
                    {
                        var res = RemoteService.SyncSaleLog(input.CardNo, input.Location);
                        if (!DataBus.IsTest)
                            Main.GetInstance.Start(input.Location.AsInt());
                        DbContext.Context.Updateable<SaleLog>().SetColumns(t => t.IsSync == true).Where(t => t.Id == entity.Id).ExecuteCommand();
                        return res;
                    }
                }
                return false;
            }
            catch (Exception ex)
            {
                HKLog.HKLogImport.WriteError(ex);
                return false;
            }

        }
        /// <summary>
        /// 晚上
        /// </summary>
        /// <param name="input"></param>
        /// <param name="Old"></param>
        /// <returns></returns>
        public bool DeviceSaleAT(SaleLog input)
        {
            try
            {
                var Old = Commom(input);
                if (Old == null) return false;
                var AT = DataBus.AT.Split(",").Select(t => t.AsInt()).ToList();
                var ATDay = Old.Where(t => t.CreateTime.Hour >= AT[0] && t.CreateTime.Hour < AT[1])
                    .Where(t => t.CreateTime.Year == DateTime.Now.Year)
                    .Where(t => t.CreateTime.Month == DateTime.Now.Month)
                    .Where(t => t.CreateTime.Day == DateTime.Now.Day)
                    .Count();
                HKLog.HKLogImport.WriteInfo($"卡号{input.CardNo}下午消费次数：{ATDay}");
                if (ATDay < 1)
                {
                    var entity = DbContext.Context.Insertable(input).CallEntityMethod(t => t.Create()).ExecuteReturnEntity();
                    if (entity.Id != Guid.Empty)
                    {
                        var res = RemoteService.SyncSaleLog(input.CardNo, input.Location);
                        if (!DataBus.IsTest)
                            Main.GetInstance.Start(input.Location.AsInt());
                        DbContext.Context.Updateable<SaleLog>().SetColumns(t => t.IsSync == true).Where(t => t.Id == entity.Id).ExecuteCommand();
                        return res;
                    }
                }
                return false;
            }
            catch (Exception ex)
            {
                HKLog.HKLogImport.WriteError(ex);
                return false;
            }
        }
        /// <summary>
        /// 获取当天消费前100条展示
        /// </summary>
        /// <returns></returns>
        public List<SaleLog> PullDaySaleLog()
        {
            var Begin = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd 00:00:00"));
            var End = DateTime.Parse(DateTime.Now.ToString("yyyy-MM-dd 23:59:59"));
            var data = DbContext.Context.Queryable<SaleLog>()
                   .Where(t => t.CreateTime >= Begin)
                   .Where(t => t.CreateTime < End)
                   .OrderByDescending(t => t.CreateTime).ToPageList(0, 100);
            return data.GroupBy(t => t.CardNo).Select(t => new SaleLog
            {
                CardNo = t.Key,
                Location = String.Join(",", t.Select(m => m.Location)),
                Count = t.Count()
            }).ToList();
        }
    }
}
