using Edu.AOP.CustomerAttribute;
using Edu.Common.Enum;
using Edu.Common.Enum.User;
using Edu.Model.CacheModel;
using Edu.Model.Entity.User;
using Edu.Model.ViewModel.User;
using Edu.Repository.User;
using System;
using System.Collections.Generic;
using System.Linq;
using VT.FW.DB;

namespace Edu.Module.User
{
    /// <summary>
    /// 助教处理类
    /// </summary>
    public class AssistModule
    {
        /// <summary>
        /// 助教仓储层对象
        /// </summary>
        private readonly RB_AssistRepository assistRepository = new RB_AssistRepository();

        /// <summary>
        /// 账号处理类
        /// </summary>
        private readonly AccountModule accountModule = new AccountModule();

        /// <summary>
        /// 部门仓储层对象
        /// </summary>
        private readonly RB_DepartmentRepository departmentRepository = new RB_DepartmentRepository();

        /// <summary>
        /// 岗位仓储层对象
        /// </summary>
        private readonly RB_PostRepository postRepository = new RB_PostRepository();

        /// <summary>
        /// 获取助教列表
        /// </summary>
        /// <param name="query"></param>
        /// <returns></returns>
        public List<RB_Assist_ViewModel> GetAssistListModule(RB_Assist_ViewModel query)
        {
            return assistRepository.GetAssistListRepository(query);
        }


        /// <summary>
        /// 获取助教分页列表
        /// </summary>
        /// <param name="pageIndex"></param>
        /// <param name="pageSize"></param>
        /// <param name="rowsCount"></param>
        /// <param name="query"></param>
        /// <returns></returns>
        public List<RB_Assist_ViewModel> GetAssistPageListModule(int pageIndex, int pageSize, out long rowsCount, RB_Assist_ViewModel query)
        {
            var list= assistRepository.GetAssistPageListRepository(pageIndex, pageSize, out rowsCount, query);
            if (list != null && list.Count > 0)
            {
                string postIds = string.Join(",", list.Where(qitem => qitem.Post_Id > 0).Select(qitem => qitem.Post_Id));
                string deptIds = string.Join(",", list.Where(qitem => qitem.Dept_Id > 0).Select(qitem => qitem.Dept_Id));
                List<RB_Post_ViewModel> postList = new List<RB_Post_ViewModel>();
                List<RB_Department_ViewModel> deptList = new List<RB_Department_ViewModel>();
                if (!string.IsNullOrEmpty(postIds))
                {
                    postList = postRepository.GetPostListRepository(new RB_Post_ViewModel() { QPostIds = postIds });
                }
                if (!string.IsNullOrEmpty(deptIds))
                {
                    deptList = departmentRepository.GetDepartmentListRepository(new RB_Department_ViewModel() { QDeptIds = deptIds });
                }
                foreach (var item in list)
                {
                    item.DeptName = deptList?.Where(qitem => qitem.DeptId == item.Dept_Id)?.FirstOrDefault()?.DeptName ?? "";
                    item.PostName = postList?.Where(qitem => qitem.PostId == item.Post_Id)?.FirstOrDefault()?.PostName ?? "";
                }
            }
            return list;
        }

        /// <summary>
        /// 添加修改助教
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public bool SetAssistModule(RB_Assist model)
        {
            bool flag;
            if (model.AId > 0)
            {
                Dictionary<string, object> fileds = new Dictionary<string, object>()
                {
                    {nameof(RB_Assist.School_Id),model.School_Id },
                    {nameof(RB_Assist.Teacher_Id),model.Teacher_Id },
                    {nameof(RB_Assist.AssistName),model.AssistName.Trim() },
                    {nameof(RB_Assist.AssistTel),model.AssistTel },
                    {nameof(RB_Assist.AssistIcon),model.AssistIcon },
                    {nameof(RB_Assist.AssistIntro),model.AssistIntro },
                    {nameof(RB_Assist.UpdateBy),model.UpdateBy },
                    {nameof(RB_Assist.UpdateTime),model.UpdateTime },
                    {nameof(RB_Teacher_ViewModel.Dept_Id),model.Dept_Id },
                    {nameof(RB_Teacher_ViewModel.Post_Id),model.Post_Id },
                };
                flag = assistRepository.Update(fileds, new WhereHelper(nameof(RB_Assist.AId), model.AId));
            }
            else
            {
                var newId = assistRepository.Insert(model);
                model.AId = newId;
                flag = newId > 0;
            }
            return flag;
        }

        /// <summary>
        /// 根据编号获取助教实体
        /// </summary>
        /// <param name="Id"></param>
        /// <returns></returns>
        public RB_Assist_ViewModel GetAssistModule(int AId)
        {
            return assistRepository.GetEntity<RB_Assist_ViewModel>(AId);
        }

        /// <summary>
        /// 根据编号移除助教
        /// </summary>
        /// <param name="AId"></param>
        /// <returns></returns>
        [TransactionCallHandler]
        public virtual bool RemoveAssistModule(int AId)
        {
            bool flag = false;
            var model = GetAssistModule(AId);
            if (model != null && model.AId > 0)
            {
                Dictionary<string, object> fileds = new Dictionary<string, object>()
                {
                    {nameof(RB_Assist.Status),(int)DateStateEnum.Delete },
                };
                flag = assistRepository.Update(fileds, new WhereHelper(nameof(RB_Assist.AId), AId));
                var accountList = accountModule.GetAccountListExtModule(new RB_Account_ViewModel()
                {
                    AccountId=model.AId,
                    Account = model.AssistTel,
                    AccountType = AccountTypeEnum.Assist
                });
                if (accountList != null && accountList.Count > 0)
                {
                    flag = accountModule.SetAccountStatusModule(new RB_Account_ViewModel()
                    {
                        AccountType = AccountTypeEnum.Assist,
                        AccountId = model.AId,
                        UpdateTime = DateTime.Now,
                        Status = DateStateEnum.Delete
                    });
                }
            }
            return flag;
        }

        /// <summary>
        /// 助教重新申请
        /// </summary>
        /// <param name="AId"></param>
        /// <returns></returns>
        public bool ReApplyAssistModule(object AId)
        {
            Dictionary<string, object> fileds = new Dictionary<string, object>()
            {
                {nameof(RB_Assist.AuditStatus),(int)AccountStatusEnum.Normal },
            };
            bool flag = assistRepository.Update(fileds, new WhereHelper(nameof(RB_Assist.AId), AId));
            return flag;
        }

        /// <summary>
        /// 讲师审核
        /// </summary>
        /// <param name="AId">助教编号</param>
        /// <param name="AuditStatus">审核状态</param>
        /// <param name="AuditRemark">审核备注</param>
        /// <param name="user">用户信息</param>
        /// <returns></returns>
        [TransactionCallHandler]
        public virtual bool AuditAssistModule(int AId, int AuditStatus, string AuditRemark, UserInfo user)
        {
            bool flag = false;
            var model = GetAssistModule(AId);
            if (model != null && model.AId > 0)
            {
                Dictionary<string, object> fileds = new Dictionary<string, object>()
                {
                    {nameof(RB_Assist_ViewModel.AuditStatus),AuditStatus },
                    {nameof(RB_Assist_ViewModel.Remark),AuditRemark },
                };
                flag = assistRepository.Update(fileds, new WhereHelper(nameof(RB_Assist_ViewModel.AId), AId));
                AccountStatusEnum statusEnum = (AccountStatusEnum)AuditStatus;
                if (statusEnum == AccountStatusEnum.Pass && flag)
                {
                    var accountList = accountModule.GetAccountListExtModule(new RB_Account_ViewModel()
                    {
                        Account = model.AssistTel,
                        AccountType = AccountTypeEnum.Assist
                    });
                    if (accountList == null || (accountList != null && accountList.Count == 0))
                    {
                        flag = accountModule.SetAccountModule(new RB_Account_ViewModel()
                        {
                            Account = model.AssistTel,
                            Password = Common.DES.Encrypt(Common.Config.DefaultPwd),
                            AccountType = AccountTypeEnum.Assist,
                            AccountId = model.AId,
                            CreateBy = user.Id,
                            UpdateBy = user.Id,
                            CreateTime = DateTime.Now,
                            UpdateTime = DateTime.Now,
                            Group_Id = model.Group_Id,
                            School_Id = model.School_Id,
                        });
                    }
                }
            }
            return flag;
        }
    }
}