using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using Edu.Common;
using Edu.Common.Enum.Course;
using Edu.Common.Enum.System;
using Edu.Model.Entity.EduTask;
using Edu.Model.Entity.Sell;
using Edu.Model.ViewModel.EduTask;
using Edu.Model.ViewModel.Grade;
using Edu.Model.ViewModel.Sell;
using Edu.Repository.Grade;
using Edu.Repository.Sell;
using VT.FW.DB;

namespace Edu.Repository.EduTask
{
    public class RB_Student_LeaveRepository : BaseRepository<RB_Student_Leave>
    {
        // <summary>
        /// 订单学员仓储层对象
        /// </summary>
        private readonly RB_Order_GuestRepository order_GuestRepository = new RB_Order_GuestRepository();

        /// <summary>
        /// 教务单据仓储层对象
        /// </summary>
        private readonly RB_Education_ReceiptRepository education_ReceiptRepository = new RB_Education_ReceiptRepository();
        /// <summary>
        /// 课程基础配置
        /// </summary>
        private readonly RB_Class_ConfigRepository class_ConfigRepository = new RB_Class_ConfigRepository();
        /// <summary>
        /// 班级仓储层对象
        /// </summary>
        private readonly RB_ClassRepository classRepository = new RB_ClassRepository();
        /// <summary>
        /// 课程签到记录表
        /// </summary>
        private readonly RB_Class_CheckRepository classCheckRepository = new RB_Class_CheckRepository();
        /// <summary>
        /// 班级上课计划仓储层对象
        /// </summary>
        private readonly RB_Class_PlanRepository class_PlanRepository = new RB_Class_PlanRepository();

        /// <summary>
        /// 订单仓储层对象
        /// </summary>
        private readonly RB_OrderRepository orderRepository = new RB_OrderRepository();

        /// <summary>
        /// 账户仓储层
        /// </summary>
        private readonly User.RB_AccountRepository accountRepository = new User.RB_AccountRepository();
        /// <summary>
        /// 日志仓储对象
        /// </summary>
        private readonly Log.RB_User_ChangeLogRepository user_ChangeLogRepository = new Log.RB_User_ChangeLogRepository();
        /// <summary>
        /// 班级上课计划上课时间仓储层对象
        /// </summary>
        private readonly RB_Class_TimeRepository class_TimeRepository = new RB_Class_TimeRepository();

        /// <summary>
        /// 学员补课记录表仓储层对象
        /// </summary>
        private readonly BackClass.RB_Student_MakeupRepository student_MakeupRepository = new BackClass.RB_Student_MakeupRepository();
        /// <summary>
        /// 获取请假列表
        /// </summary>
        /// <param name="query"></param>
        /// <returns></returns>
        public List<RB_Student_Leave_ViewModel> GetStudentLeaveListRepository(RB_Student_Leave_ViewModel query)
        {
            StringBuilder builder = new StringBuilder();
            builder.AppendFormat(@"  SELECT A.*,IFNULL(B.ClassName,'') AS ClassName FROM RB_Student_Leave AS A LEFT JOIN rb_class AS B ON A.ClassId=B.ClassId WHERE 1=1 ");
            if (query != null)
            {
                if (!string.IsNullOrEmpty(query.Q_Student_Leave_Ids))
                {
                    builder.AppendFormat(@" AND A.{0} IN ({1}) ", nameof(RB_Student_Leave_ViewModel.Id), query.Q_Student_Leave_Ids);
                }
            }
            return Get<RB_Student_Leave_ViewModel>(builder.ToString()).ToList();
        }


        /// <summary>
        /// 审核通过后更新学生签到表
        /// </summary>
        /// <param name="Id"></param>
        /// <returns></returns>
        public bool UpdateStundetLeave(object Id, int CreateById)
        {
            //查询当前调课信息
            bool flag = false;
            var receiptModel = education_ReceiptRepository.GetEntity(Id);
            if (receiptModel == null || receiptModel.Id == 0)
            {
                return false;
            }
            if (receiptModel.ReceiptType != Common.Enum.Finance.ReceiptTypeEnum.LeaveClass)
            {
                return false;
            }
            var model = GetEntity(receiptModel.RelationId);
            if (model == null || model.Id == 0)
            {
                return false;
            }
            else //更新学生的信息
            {
                List<LeaveInfoModel> LeaveInfoList = new List<LeaveInfoModel>();
                if (!string.IsNullOrWhiteSpace(model.LeaveInfo))
                {
                    LeaveInfoList = Common.Plugin.JsonHelper.DeserializeObject<List<LeaveInfoModel>>(model.LeaveInfo);
                }

                //学生信息
                List<RB_Order_Guest_ViewModel> orderGuestList = new List<RB_Order_Guest_ViewModel>();

                //班级上课计划列表
                List<RB_Class_Plan_ViewModel> planList = new List<RB_Class_Plan_ViewModel>();
                //班级上课时间列表
                List<RB_Class_Time_ViewModel> timeList = new List<RB_Class_Time_ViewModel>();

                string orderGuestIds = model.OrderGuestId.ToString();
                if (!string.IsNullOrWhiteSpace(orderGuestIds))
                {
                    orderGuestList = order_GuestRepository.GetStopingStudentPage(new RB_Order_Guest_ViewModel
                    {
                        OrderGuestIds = orderGuestIds
                    });
                }

                string classTimeIds = model.ClassTimeIds;
                if (!string.IsNullOrWhiteSpace(classTimeIds))
                {
                    timeList = class_TimeRepository.GetClassTimeListRepository(new RB_Class_Time_ViewModel { QClassTimeIds = classTimeIds });
                    if (timeList != null && timeList.Any())
                    {
                        string classPlanIds = string.Join(",", timeList.Select(x => x.ClassPlanId));

                        if (!string.IsNullOrWhiteSpace(classPlanIds))
                        {
                            planList = class_PlanRepository.GetClassPlanListRepository(new RB_Class_Plan_ViewModel { QClassPlanIds = classPlanIds });
                        }
                    }
                }

                List<RB_Class_Check_ViewModel> classCheckList = new List<RB_Class_Check_ViewModel>();

                //判断当天是否有已签到数据
                var checkLogList = classCheckRepository.GetClassCheckList(new RB_Class_Check_ViewModel
                {
                    Group_Id = model.Group_Id,
                    ClassId = model.ClassId,
                    Q_ClassTimeIds = model.ClassTimeIds,
                });

                foreach (var item in timeList)
                {
                    DateTime? dateTime = planList.Where(x => x.ClassPlanId == item.ClassPlanId).FirstOrDefault()?.ClassDate;
                    if (!dateTime.HasValue)
                    {
                        try
                        {
                            dateTime = Convert.ToDateTime(LeaveInfoList.Where(x => x.ClassTimeId == item.ClassTimeId).FirstOrDefault().ClassDate);
                        }
                        catch (Exception ex)
                        {
                            Common.Plugin.LogHelper.Write(ex, "UpdateStundetLeave");
                        }
                    }
                    var signModel = checkLogList?.Where(qitem => qitem.ClassTimeId == item.ClassTimeId && qitem.ClassId == item.ClassId && qitem.OrderGuestId == model.OrderGuestId)?.FirstOrDefault();
                    RB_Class_Check_ViewModel invitationModel = new RB_Class_Check_ViewModel()
                    {
                        ClassCheckId = (signModel != null && signModel.ClassCheckId > 0) ? signModel.ClassCheckId : 0,
                        ClassId = model.ClassId,
                        Group_Id = model.Group_Id,
                        School_Id = model.School_Id,
                        CheckStatus = 2,
                        StudyNum = 0,
                        Status = 0,
                        TeacherId = planList.Where(x => x.ClassPlanId == item.ClassPlanId).FirstOrDefault()?.TeacherId ?? 0,
                        ClassRoomId = planList.Where(x => x.ClassPlanId == item.ClassPlanId).FirstOrDefault()?.ClassRoomId ?? 0,
                        ClassDate = dateTime.Value,
                        ClassTimeId = item.ClassTimeId,
                        OrderGuestId = model.OrderGuestId,
                        CreateBy = CreateById,
                        CreateTime = DateTime.Now
                    };
                    classCheckList.Add(invitationModel);
                }
                if (classCheckList != null && classCheckList.Any())
                {
                    //flag = classCheckRepository.StudentCheckRepository(classCheckList,1);
                }
            }
            return flag;
        }
    }
}