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

namespace HKCardOUT.Logic.Service
{
    public class HKCore
    {
        List<SaleLog> Commom(SaleLog input)
        {
            if (DataBus.StartDevice) {

                var checkDevice = !Main.GetInstance.GetIsSwipe(input.Location.AsInt());
                HKLogImport.WriteInfo("设备是否可以出餐" + checkDevice);
                if (checkDevice) 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 (DataBus.Admin.Contains(input.CardNo))
            {
                return Old;
            }
            else
            {
                if (DataBus.Cancel)
                    if (Old.Count > 3) return null;
                return Old;
            }
        }

        bool GetCardStutas(string CardNo)
        {
            var data = DbContext.Context.Queryable<CardStutas>().First(t => t.CardNo == CardNo);
            if (data == null) return false;
            if (data.Stutas != 1) return false;
            return true;
        }
        public static void AddCard(List<CardStutas> input)
        {
            var temp = DbContext.Context.Queryable<CardStutas>().Where(t => input.Select(m => m.CardNo).Contains(t.CardNo)).Distinct().ToList();
            List<CardStutas> waitUpdate = new List<CardStutas>();
            List<CardStutas> waitInsert = new List<CardStutas>();
            foreach (var item in input)
            {
                if (temp.Select(t => t.CardNo).Contains(item.CardNo))
                {
                    waitUpdate.Add(item);
                }
                else
                {
                    waitInsert.Add(item);
                }
            }
            if (waitUpdate.Count > 0)
            {
                waitUpdate.ForEach(t =>
                {
                    DbContext.Context.Updateable<CardStutas>().SetColumns(t => t.Stutas == t.Stutas).Where(t => t.CardNo == t.CardNo).ExecuteCommand();
                });
            }
            if (waitInsert.Count > 0)
            {
                DbContext.Context.Insertable(waitInsert).CallEntityMethod(t => t.Create()).ExecuteCommand();
            }
        }

        /// <summary>
        /// 早上消费
        /// </summary>
        /// <param name="input"></param>
        /// <returns></returns>
        public bool DeviceSaleAM(SaleLog input)
        {
            try
            {
                if (!GetCardStutas(input.CardNo))
                {
                    HKLogImport.WriteInfo($"当前卡异常，卡号：【{input.CardNo}】");
                    return false;
                }
                var Old = Commom(input);
                if (Old == null) return false;
                var AMDay = Old.Where(t => t.CreateTime >= DataBus.Times.AMStartTime && t.CreateTime < DataBus.Times.AMEndTime)
                    .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();
                HKLogImport.WriteInfo($"卡号{input.CardNo}上午消费次数：{AMDay}");
                if (DataBus.Admin.Contains(input.CardNo))
                {
                    var entity1 = DbContext.Context.Insertable(input).CallEntityMethod(t => t.Create()).ExecuteReturnEntity();
                    if (entity1.Id != Guid.Empty)
                    {
                        if (DataBus.StartDevice)
                        {
                            Main.GetInstance.Start(input.Location.AsInt());  
                            HKLogImport.WriteInfo($"设备位置：{input.Location}，卡号：{input.CardNo}，成功出餐");
                        }
                        return true;
                    }
                }
               else if (AMDay < DataBus.Count)
                {
                    var entity = DbContext.Context.Insertable(input).CallEntityMethod(t => t.Create()).ExecuteReturnEntity();
                    if (entity.Id != Guid.Empty)
                    {
                        if (DataBus.StartDevice)
                        {
                            Main.GetInstance.Start(input.Location.AsInt());
                            HKLogImport.WriteInfo($"设备位置：{input.Location}，卡号：{input.CardNo}，成功出餐");
                        }
                        return true;
                    }
                }
                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
            {
                if (!GetCardStutas(input.CardNo))
                {
                    HKLogImport.WriteInfo($"当前卡异常，卡号：【{input.CardNo}】");
                    return false;
                }
                var Old = Commom(input);
                if (Old == null) return false;
                var PMDay = Old.Where(t => t.CreateTime >= DataBus.Times.PMStartTime && t.CreateTime < DataBus.Times.PMEndTime).
                      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 (DataBus.Admin.Contains(input.CardNo))
                {
                    var entity1 = DbContext.Context.Insertable(input).CallEntityMethod(t => t.Create()).ExecuteReturnEntity();
                    if (entity1.Id != Guid.Empty)
                    {
                        if (DataBus.StartDevice)
                        {
                            Main.GetInstance.Start(input.Location.AsInt());
                            HKLogImport.WriteInfo($"设备位置：{input.Location}，卡号：{input.CardNo}，成功出餐");
                        }
                        return true;
                    }
                }
                else if (PMDay < DataBus.Count)
                {
                    var entity = DbContext.Context.Insertable(input).CallEntityMethod(t => t.Create()).ExecuteReturnEntity();
                    if (entity.Id != Guid.Empty)
                    {
                        if (DataBus.StartDevice)
                        {
                            Main.GetInstance.Start(input.Location.AsInt());
                            HKLogImport.WriteInfo($"设备位置：{input.Location}，卡号：{input.CardNo}，成功出餐");
                        }
                        return true;
                    }
                }
                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
            {
                if (!GetCardStutas(input.CardNo))
                {
                    HKLogImport.WriteInfo($"当前卡异常，卡号：【{input.CardNo}】");
                    return false;
                }
                var Old = Commom(input);
                if (Old == null) return false;
                var ATDay = Old.Where(t => t.CreateTime >= DataBus.Times.ATStartTime && t.CreateTime < DataBus.Times.ATEndTime)
                    .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 (DataBus.Admin.Contains(input.CardNo))
                {
                    var entity1 = DbContext.Context.Insertable(input).CallEntityMethod(t => t.Create()).ExecuteReturnEntity();
                    if (entity1.Id != Guid.Empty)
                    {
                        if (DataBus.StartDevice)
                        {
                            Main.GetInstance.Start(input.Location.AsInt());
                            HKLogImport.WriteInfo($"设备位置：{input.Location}，卡号：{input.CardNo}，成功出餐");
                        }
                        return true;
                    }
                }
                else if (ATDay < DataBus.Count)
                {
                    var entity = DbContext.Context.Insertable(input).CallEntityMethod(t => t.Create()).ExecuteReturnEntity();
                    if (entity.Id != Guid.Empty)
                    {
                        if (DataBus.StartDevice)
                        {
                            Main.GetInstance.Start(input.Location.AsInt());
                            HKLogImport.WriteInfo($"设备位置：{input.Location}，卡号：{input.CardNo}，成功出餐");
                        }
                        return true;
                    }
                }
                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();
        }
    }
}
