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

namespace Edu.Repository.BackClass
{
    /// <summary>
    /// 学员退课单据仓储层
    /// </summary>
    public class RB_Student_BackClassRepository : BaseRepository<RB_Student_BackClass>
    {
        /// <summary>
        /// 订单学员仓储层对象
        /// </summary>
        private readonly RB_Order_GuestRepository order_GuestRepository = new RB_Order_GuestRepository();

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

        /// <summary>
        /// 订单转班仓储层对象
        /// </summary>
        private readonly RB_Order_ChangeRepository order_ChangeRepository = new RB_Order_ChangeRepository();

        /// <summary>
        /// 退课协议仓储层对象
        /// </summary>
        private readonly RB_BackClass_ProtocolRepository backClass_ProtocolRepository = new RB_BackClass_ProtocolRepository();

        /// <summary>
        /// 获取学员退课单据列表
        /// </summary>
        /// <param name="query"></param>
        /// <returns></returns>
        public List<RB_Student_BackClass_ViewModel> GetStudentBackClassListRepository(RB_Student_BackClass_ViewModel query)
        {
            var parameters = new DynamicParameters();
            StringBuilder builder = new StringBuilder();
            builder.AppendFormat(@"
SELECT A.*,IFNULL(B.GuestName,'') AS GuestName,ec.ContractNo,ec.Id as ContractId,IFNULL(C.SName,'') AS SchoolName,IFNULL(D.ClassName,'') AS ClassName,IFNULL(T.TeacherName,'') AS TeacherName
      ,IFNULL(E.EnterID,0) AS EnterID,IFNULL(F.CourseName,'') AS CourseName,D.ClassNo,B.TotalHours,B.CompleteHours,IFNULL(G.Id,0) AS BackClassProtocolId,IFNULL(G.ProtocolNum,'') AS ProtocolNum
FROM RB_Student_BackClass AS A LEFT JOIN rb_order_guest AS B ON A.GuestId=B.Id
     LEFT JOIN rb_education_contract ec on B.Id = ec.GuestId and ec.Status <>4
     LEFT JOIN rb_class AS D ON A.ClassId=D.ClassId
     LEFT JOIN rb_school AS C ON D.School_Id=C.SId
     LEFT JOIN (SELECT account.Id,teac.TeacherName FROM rb_account AS account INNER JOIN rb_teacher AS teac ON account.AccountId=teac.TId AND account.AccountType=2)
               AS T ON A.TeacherId=T.Id
     LEFT JOIN rb_order AS E ON A.OrderId=E.OrderId
     LEFT JOIN rb_course AS F ON D.CouseId=F.CourseId
     LEFT JOIN rb_backclass_protocol AS G ON A.BackId=G.BackId
WHERE 1=1   ");
            if (query != null)
            {
                if (query.Group_Id > 0)
                {
                    builder.AppendFormat(@" AND A.{0}={1} ", nameof(RB_Student_BackClass_ViewModel.Group_Id), query.Group_Id);
                }
                if (!string.IsNullOrEmpty(query.QBackIds))
                {
                    builder.AppendFormat(@" AND A.{0} IN({1}) ", nameof(RB_Student_BackClass_ViewModel.BackId), query.QBackIds);
                }
            }
            return Get<RB_Student_BackClass_ViewModel>(builder.ToString()).ToList();
        }

        /// <summary>
        /// 获取总退课条数
        /// </summary>
        /// <returns></returns>
        public int GetStudentBackClassNumRepository()
        {
            int result = 0;
            string sql = "SELECT COUNT(1) FROM RB_Student_BackClass ";
            var obj = base.ExecuteScalar(sql);
            if (obj != null)
            {
                Int32.TryParse(obj.ToString(), out result);
            }
            return result + 1;
        }

        /// <summary>
        /// 更新退课相关信息
        /// </summary>
        /// <param name="receiptModel"></param>
        /// <param name="auditModel"></param>
        /// <returns></returns>
        public bool UpdateStudentBackClassRepository(RB_Education_Receipt receiptModel, EduReceiptAudit auditModel)
        {
            var backModel = base.GetEntity(receiptModel.RelationId);
            Dictionary<string, object> backFileds = new Dictionary<string, object>()
            {
               {nameof(RB_Student_BackClass_ViewModel.AuditStatus),auditModel.AuditStatus }
            };
            //退课协议审核状态
            Dictionary<string, object> backprotocolFileds = new Dictionary<string, object>()
            {
               {nameof(RB_BackClass_Protocol_ViewModel.AuditStatus),auditModel.AuditStatus }
            };
            if (!string.IsNullOrEmpty(auditModel.RecipientIds))
            {
                backFileds.Add(nameof(RB_Student_BackClass_ViewModel.RecipientIds), auditModel.RecipientIds);
            }
            //特殊节点更新时间退课金额
            if (auditModel.SpecialNode == 1)
            {
                backFileds.Add(nameof(RB_Student_BackClass_ViewModel.RealityBackMoney), auditModel.BackMoney);
            }
            bool flag = base.Update(backFileds, new WhereHelper(nameof(RB_Student_BackClass_ViewModel.BackId), backModel.BackId));
            if (flag)
            {
                if (auditModel.AuditStatus == 2)
                {
                    //审核通过自动盖章
                    backprotocolFileds.Add(nameof(RB_BackClass_Protocol_ViewModel.IsCompanySeal), 1);
                    backprotocolFileds.Add(nameof(RB_BackClass_Protocol_ViewModel.PartyBSignDate), DateTime.Now);
                }
                //更新退课协议审核状态
                flag = backClass_ProtocolRepository.Update(backprotocolFileds, new WhereHelper(nameof(RB_BackClass_Protocol_ViewModel.BackId), backModel.BackId));
            }

            if (flag)
            {
                var guestList = order_GuestRepository.GetOrderGuestListRepository(new RB_Order_Guest_ViewModel() { OrderId = backModel.OrderId });
                if (guestList != null && guestList.Where(qitem => qitem.GuestState == GuestStateEnum.DropOut).Count() == guestList.Count())
                {
                    //更新订单为退学状态
                    Dictionary<string, object> orderFileds = new Dictionary<string, object>()
                    {
                        {nameof(RB_Order.OrderState),OrderStateEnum.DropOut }
                    };
                    flag = orderRepository.Update(orderFileds, new WhereHelper(nameof(RB_Order.OrderId), backModel.OrderId));
                }

            }
            if (flag)
            {
                int GuestState = 0;
                if (auditModel.AuditStatus == 2)
                {
                    GuestState = 2;
                }
                if (auditModel.AuditStatus == 3)
                {
                    GuestState = 4;
                }
                ///更新学员退课状态
                Dictionary<string, object> guestFileds = new Dictionary<string, object>()
                {
                    {nameof(RB_Order_Guest_ViewModel.GuestState),GuestState }
                };
                flag = order_GuestRepository.Update(guestFileds, new WhereHelper(nameof(RB_Order_Guest_ViewModel.Id), backModel.GuestId));
            }
            return flag;
        }


        /// <summary>
        /// 更新退课相关信息
        /// </summary>
        /// <param name="receiptModel"></param>
        /// <param name="auditModel"></param>
        /// <returns></returns>
        public bool UpdateGuestStateRepository(RB_Education_Receipt receiptModel, EduReceiptAudit auditModel)
        {
            bool flag = false;
            var model = order_ChangeRepository.GetEntity(receiptModel.RelationId);
            int GuestState = 0;
            if (auditModel.AuditStatus == 2)
            {
                GuestState = 7;
            }
            if (auditModel.AuditStatus == 3)
            {
                GuestState = 4;
            }
            ///更新学员退课状态
            Dictionary<string, object> guestFileds = new Dictionary<string, object>()
            {
                {nameof(RB_Order_Guest_ViewModel.GuestState),GuestState }
            };
            flag = order_GuestRepository.Update(guestFileds, new WhereHelper(nameof(RB_Order_Guest_ViewModel.Id), model.OrderGuestId));
            return flag;
        }


        /// <summary>
        /// 根据学生id获取学生的退课合同信息
        /// </summary>
        /// <param name="teacherIds"></param>
        /// <returns></returns>
        public List<RB_Student_BackClass_ViewModel> GetStudentBackClassInfo(int Student_Id, int Group_Id)
        {
            var parameters = new DynamicParameters();
            StringBuilder builder = new StringBuilder();
            builder.AppendFormat($@"SELECT sbc.*,bcp.ProtocolNum,bcp.Id as  BackClassProtocolId ,bcp.IsCompanySeal from rb_student_backclass as sbc 
LEFT JOIN rb_backclass_protocol as bcp on sbc.BackId=bcp.BackId
LEFT JOIN rb_student_orderguest as sog on sog.GuestId=sbc.GuestId
where bcp.AuditStatus=2  and sog.Student_Id={Student_Id}  and sbc.Group_Id={Group_Id}");
            return Get<RB_Student_BackClass_ViewModel>(builder.ToString(), parameters).ToList();
        }
    }
}