using Edu.AOP.CustomerAttribute;
using Edu.Common.Enum;
using Edu.Common.Enum.User;
using Edu.Model.CacheModel;
using Edu.Model.ViewModel.Customer;
using Edu.Model.ViewModel.Mall;
using Edu.Model.ViewModel.User;
using Edu.Repository.Customer;
using Edu.Repository.Mall;
using Edu.Repository.Reserve;
using Edu.Repository.System;
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 StudentModule
    {
        /// <summary>
        /// 学生仓储层对象
        /// </summary>
        private readonly RB_StudentRepository studentRepository = new RB_StudentRepository();

        /// <summary>
        /// 地区仓储层对象
        /// </summary>
        private readonly RB_DestinationRepository destinationRepository = new RB_DestinationRepository();

        /// <summary>
        /// 同业
        /// </summary>
        private readonly RB_CustomerRepository customerRepository = new RB_CustomerRepository();

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



        /// <summary>
        /// 小程序用户仓储层对象  add by:W  2021-09-15
        /// </summary>
        private readonly RB_Member_UserRepository member_UserRepository = new RB_Member_UserRepository();

        /// <summary>
        /// 学员订单关联表仓储层
        /// </summary>

        private readonly RB_Student_OrderGuestRepository student_OrderGuestRepository = new RB_Student_OrderGuestRepository();

        /// <summary>
        /// 学员跟进
        /// </summary>
        private readonly RB_Student_FollowRepository followRepository = new RB_Student_FollowRepository();

        /// <summary>
        /// 学员协助人员仓储层对象
        /// </summary>
        private readonly RB_Student_AssistRepository student_AssistRepository = new RB_Student_AssistRepository();

        /// <summary>
        /// 学员到访仓储层对象
        /// </summary>
        private readonly RB_Student_VisitRepository student_VisitRepository = new RB_Student_VisitRepository();

        /// <summary>
        /// 学员试听课仓储层对象
        /// </summary>
        private readonly RB_Visitor_ReserveRepository  visitor_ReserveRepository = new RB_Visitor_ReserveRepository();

        /// <summary>
        /// 获取学生列表
        /// </summary>
        /// <param name="query"></param>
        /// <returns></returns>
        public List<RB_Student_ViewModel> GetStudentListModule(RB_Student_ViewModel query)
        {
            return studentRepository.GetStudentListRepository(query);
        }

        /// <summary>
        /// 获取学生分页列表
        /// </summary>
        /// <param name="pageIndex"></param>
        /// <param name="pageSize"></param>
        /// <param name="rowsCount"></param>
        /// <param name="query"></param>
        /// <returns></returns>
        public List<RB_Student_ViewModel> GetStudentPageListModule(int pageIndex, int pageSize, out long rowsCount, RB_Student_ViewModel query)
        {
            var list = studentRepository.GetStudentPageListRepository(pageIndex, pageSize, out rowsCount, query);
            if (list != null && list.Count > 0)
            {
                string stuIds = string.Join(",", list.Select(qitem => qitem.StuId));
                //学员跟进
                var followList= followRepository.GetStudentFollowListRepository(new Model.ViewModel.Customer.RB_Student_Follow_Extend()
                {
                    QStuIds = stuIds
                });
                //学员订单
                var stuOrderList = student_OrderGuestRepository.GetStrOrderGuestListRepository(new RB_Student_OrderGuest_ViewModel()
                {
                    QStudentIds = stuIds
                });
                //本周新增
                var stuList= studentRepository.GetCustomerStuWeekListRepository(new RB_Student_ViewModel()
                {
                    CustomerId = query.CustomerId
                });
                //协助人员列表
                var assistList = student_AssistRepository.GetStudentAssistListRepository(new RB_Student_Assist_Extend()
                {
                    QStuIds = stuIds
                });
                List<int> empIdList= Common.ConvertHelper.StringToList(string.Join(",", list.Select(qitem => qitem.StuSourceId)));
                List<int> aIds = Common.ConvertHelper.StringToList(string.Join(",", assistList.Select(qitem => qitem.AssistId)));
                List<RB_Account_ViewModel> accountList = new List<RB_Account_ViewModel>();
                if (aIds!=null&&aIds.Count>0)
                {
                    empIdList.AddRange(aIds);
                }
                if (empIdList != null && empIdList.Count > 0)
                {
                    accountList = accountModule.GetAccountListExtModule(new RB_Account_ViewModel() { QIds = string.Join(",", empIdList) });
                }
                //学员到访统计
                var visitList = student_VisitRepository.GetStudentVisitStaticRepository(new RB_Student_Visit_Extend()
                {
                    QStuIds = stuIds
                });
                //学员试听统计
                var stuReserveList = visitor_ReserveRepository.GetStuReserveStaticsListRepository(new Model.ViewModel.Reserve.RB_Visitor_Reserve_Extend()
                {
                    QVisitor_Ids = stuIds
                });
                var provideList = list.Where(qitem => qitem.ProviceId > 0).Select(qitem => qitem.ProviceId).ToList();
                var cityList = list.Where(qitem => qitem.CityId > 0).Select(qitem => qitem.CityId).ToList();
                var areaList = list.Where(qitem => qitem.AreaId > 0).Select(qitem => qitem.AreaId).ToList();
                List<int> ids = new List<int>();
                if (provideList != null && provideList.Count > 0)
                {
                    ids.AddRange(provideList);
                }
                if (cityList != null && cityList.Count > 0)
                {
                    ids.AddRange(cityList);
                }
                if (areaList != null && areaList.Count > 0)
                {
                    ids.AddRange(areaList);
                }
                string qIds = "";
                if (ids != null && ids.Count > 0)
                {
                    qIds = string.Join(",", ids);
                }
                else
                {
                    qIds = "0";
                }
                var destinationList = destinationRepository.GetDestinationListRepository(new Model.ViewModel.System.RB_Destination_ViewModel() { Ids = qIds });
                foreach (var item in list)
                {
                    var tempOrderList = stuOrderList?.Where(qitem => qitem.Student_Id == item.StuId)?.ToList();
                    var tempFollow = followList?.Where(qitem => qitem.StuId == item.StuId)?.OrderByDescending(qitem => qitem.Id)?.FirstOrDefault();
                    item.followUpTime = Common.ConvertHelper.FormatTime(tempFollow?.CreateTime);
                    item.WeekCount = stuList?.Count()??0;
                    item.TodayCount = stuList?.Where(qitem => Common.ConvertHelper.FormatDate(qitem.CreateTime) == Common.ConvertHelper.FormatDate(DateTime.Now))?.Count() ?? 0;
                    item.OrderCount = tempOrderList?.Count() ?? 0;
                    item.RenewOrderCount = tempOrderList?.Where(qitem => qitem.RenewState == 2)?.Count()??0;
                    item.StuGuestState = tempOrderList?.OrderByDescending(qitem => qitem.OrderId)?.LastOrDefault()?.StuGuestState ?? 0;
                    item.AreaName = (destinationList?.FirstOrDefault(qitem => qitem.ID == item.ProviceId)?.Name ?? "")
                        + "/" + (destinationList?.FirstOrDefault(qitem => qitem.ID == item.CityId)?.Name ?? "")
                        + "/" + (destinationList?.FirstOrDefault(qitem => qitem.ID == item.AreaId)?.Name ?? "");

                    var tempAssistList = assistList?.Where(qitem => qitem.StuId == item.StuId)?.ToList();
                    foreach (var sItem in tempAssistList)
                    {
                        sItem.AssistName = accountList?.FirstOrDefault(qitem => qitem.Id == sItem.AssistId)?.AccountName ?? "";
                    }
                    item.AssistList = tempAssistList;
                    item.VisitCount = visitList?.FirstOrDefault(qitem => qitem.StuId == item.StuId)?.VisitCount ?? 0;
                    item.TrialLessonCount = stuReserveList?.FirstOrDefault(qitem => qitem.Visitor_Id == item.StuId)?.TrialLessonCount ?? 0;
                    item.StuSourceIdName = accountList?.FirstOrDefault(qitem => qitem.Id == item.StuSourceId)?.AccountName ?? "";
                }
            }
            return list;
        }

        /// <summary>
        /// 检查学员是否存在资料库
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public bool CheckStudentModule(RB_Student_ViewModel model)
        {
            List<WhereHelper> where = new List<WhereHelper>()
            {
                new  WhereHelper(nameof(RB_Student_ViewModel.Group_Id),model.Group_Id),
                new  WhereHelper(nameof(RB_Student_ViewModel.StuTel),model.StuTel),
            };
            if (model.StuId > 0)
            {
                where.Add(new WhereHelper()
                {
                    FiledName = nameof(RB_Student_ViewModel.StuId),
                    FiledValue = model.StuId,
                    OperatorEnum = OperatorEnum.NotEqual
                });
            }
            return studentRepository.Exists(where);
        }

        /// <summary>
        /// 添加修改学生
        /// </summary>
        /// <param name="model"></param>
        /// <param name="fromApp">来至于同业  1是</param>
        /// <returns></returns>
        public bool SetStudentModule(RB_Student_ViewModel model, int fromApp =0)
        {
            bool IsInsert = false;
            if (model.StuId == 0) { IsInsert = true; }
            bool flag = studentRepository.SetStudentRepository(model);
            if (flag)
            {
                if (IsInsert && model.CustomerId > 0 && fromApp == 1)
                {
                    var queryTargetWorkId = accountModule.GetWorkUserIdModule(model.CreateBy);
                    if (!string.IsNullOrEmpty(queryTargetWorkId))
                    {
                        var cmodel = customerRepository.GetEntity(model.CustomerId);
                        var path = $"/sale/visitorRegistrat?StuId={model.StuId}";
                        path = System.Web.HttpUtility.UrlEncode(path);
                        string markdownContent = $"`同业添加学生通知` \n>**概要信息** \n>同业名称:{cmodel.CustomerName}({cmodel.ContactNumber})\n>学生名称:{model.StuName}\n>学生电话:{model.StuTel}\n>请点击:[查看详情]({Common.Config.ErpUrl}/autologin?loginId={model.CreateBy}&target={path})";
                        Common.Message.PushMessageModel modelWork = new Common.Message.PushMessageModel()
                        {
                            CategoryId = Common.Enum.System.PushMessageCategoryEnum.B2BCustomerStu,
                            Content = markdownContent,
                            CoverImg = "",
                            CreateByName = "系统",
                            JumpUrl = "",
                            WorkMsgType = "markdown",
                            SendTime = DateTime.Now,
                            SendType = 0,
                            Title = "同业添加学生通知",
                            Platform = 5,
                            ReceiveId = queryTargetWorkId
                        };
                        Common.Message.MessageHelper.SendMessage(modelWork);
                    }
                }
            }
            return flag;
        }


        /// <summary>
        /// 学员转交
        /// </summary>
        /// <param name="StuId">学员编号</param>
        /// <param name="CreateBy">负责人</param>
        /// <param name="OperateId">操作人</param>
        /// <returns></returns>
        public bool ForwardStudentModule(int StuId, int CreateBy,int OperateId)
        {
           return studentRepository.ForwardStudentRepository(StuId, CreateBy, OperateId);
        }

        /// <summary>
        /// 根据学生编号获取学生实体类
        /// </summary>
        /// <param name="StuId"></param>
        /// <returns></returns>
        public RB_Student_ViewModel GetStudentModule(int StuId)
        {
            var extModel = studentRepository.GetEntity<RB_Student_ViewModel>(StuId);
            if (extModel != null && extModel.StuId > 0)
            {
                var assistList = student_AssistRepository.GetStudentAssistListRepository(new RB_Student_Assist_Extend()
                {
                    StuId = extModel.StuId
                });
                extModel.AssistList = assistList;
            }
            return extModel;
        }

        /// <summary>
        /// 更新学生状态
        /// </summary>
        /// <param name="StuId"></param>
        /// <param name="Status"></param>
        /// <returns></returns>
        public bool RemoveStudentModule(int StuId, int Status)
        {
            bool flag = false;
            var model = GetStudentModule(StuId);
            if (model != null && model.StuId > 0)
            {
                Dictionary<string, object> fileds = new Dictionary<string, object>()
                {
                    {nameof(RB_Student_ViewModel.Status),  Status},
                };
                flag = studentRepository.Update(fileds, new WhereHelper(nameof(RB_Student_ViewModel.StuId), StuId));
                var accountList = accountModule.GetAccountListExtModule(new RB_Account_ViewModel()
                {
                    AccountId = model.StuId,
                    Account = model.StuTel,
                    AccountType = AccountTypeEnum.Student
                });
                if (accountList != null && accountList.Count > 0)
                {
                    flag = accountModule.SetAccountStatusModule(new RB_Account_ViewModel()
                    {
                        AccountType = AccountTypeEnum.Student,
                        AccountId = model.StuId,
                        UpdateTime = DateTime.Now,
                        Status = (DateStateEnum)Status
                    });
                }
            }
            return flag;
        }

        /// <summary>
        /// 更新学员【禁用、启用】
        /// </summary>
        /// <param name="StuId"></param>
        /// <param name="IsDisable">0-禁用,1-启用</param>
        /// <returns></returns>
        public bool UpdateStudentIsDisableModule(object StuId, int IsDisable)
        {
            bool flag;
            Dictionary<string, object> fileds = new Dictionary<string, object>()
            {
                {nameof(RB_Student_ViewModel.IsDisable),  IsDisable},
            };
            flag = studentRepository.Update(fileds, new WhereHelper(nameof(RB_Student_ViewModel.StuId), StuId));
            return flag;
        }

        /// <summary>
        /// 创建学生账号
        /// </summary>
        /// <param name="StuId"></param>
        /// <param name="UserInfo"></param>
        /// <returns></returns>
        [TransactionCallHandler]
        public virtual bool CreateStudentAccountModule(int StuId, UserInfo user)
        {
            bool flag = false;
            var model = GetStudentModule(StuId);
            if (model != null && model.StuId > 0)
            {
                var accountList = accountModule.GetAccountListExtModule(new RB_Account_ViewModel()
                {
                    Account = model.StuTel,
                    AccountType = AccountTypeEnum.Student
                });
                if (accountList == null || (accountList != null && accountList.Count == 0))
                {
                    flag = accountModule.SetAccountModule(new RB_Account_ViewModel()
                    {
                        Account = model.StuTel,
                        Password = Common.DES.Encrypt(Common.Config.DefaultPwd),
                        AccountType = AccountTypeEnum.Student,
                        AccountId = model.StuId,
                        CreateBy = user.Id,
                        UpdateBy = user.Id,
                        CreateTime = DateTime.Now,
                        UpdateTime = DateTime.Now,
                        Group_Id = model.Group_Id,
                        School_Id = model.School_Id,
                        Status = model.Status
                    });
                }
            }
            return flag;
        }

        #region 学生兴趣爱好

        /// <summary>
        /// 新增学生兴趣
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        public bool SetStudentInterest(RB_Student_ViewModel model)
        {
            if (model.StuId == 0)
            {
                return false;
            }
            else
            {
                Dictionary<string, object> fileds = new Dictionary<string, object>()
                {
                    {nameof(RB_Student_ViewModel.Interest),model.Interest },
                    {nameof(RB_Student_ViewModel.JapanBaseInfo),(int)model.JapanBaseInfo },
                    {nameof(RB_Student_ViewModel.StuIcon),model.StuIcon.Trim() },
                    {nameof(RB_Student_ViewModel.StuSex),model.StuSex },
                    {nameof(RB_Student_ViewModel.UpdateTime),System.DateTime.Now }
                };
                return studentRepository.Update(fileds, new WhereHelper(nameof(RB_Student_ViewModel.StuId), model.StuId));
            }
        }
        #endregion



        /// <summary>
        /// 根据学生id获取同班账户,必须是未开班/学习中的
        /// </summary>
        /// <param name="teacherIds"></param>
        /// <returns></returns>
        public List<RB_Student_ViewModel> GetListByStudentId(int Student_Id, int Group_Id)
        {
            return studentRepository.GetListByStudentId(Student_Id, Group_Id);
        }



        /// <summary>
        /// 根据学生id获取学生的班级课程学校信息
        /// </summary>
        /// <param name="teacherIds"></param>
        /// <returns></returns>
        public List<RB_Student_ViewModel> GetStudentInfo(int Student_Id, int Group_Id)
        {
            return studentRepository.GetStudentInfo(Student_Id, Group_Id);
        }


        #region 小程序用户
        /// <summary>
        /// 根据条件获取用户实体
        /// </summary>
        /// <param name="query"></param>
        /// <returns></returns>
        public RB_Member_User_Extend GetMemberUserEntityModule(RB_Member_User_Extend query)
        {
            return member_UserRepository.GetMemberUserEntityRepository(query);
        }
        #endregion 
    }
}