using APT.BaseData.Domain.Entities;
using APT.BaseData.Domain.Entities.FM;
using APT.BaseData.Domain.Enums;
using APT.BaseData.Domain.Enums.PF;
using APT.BaseData.Domain.IServices;
using APT.BaseData.Domain.IServices.FM;
using APT.BaseData.Services.DomainServices;
using APT.BaseData.Services.Services.FM;
using APT.Infrastructure.Core;
using APT.MS.Domain.Entities.FO;
using APT.MS.Domain.Entities.HM;
using APT.MS.Domain.Entities.SC.PT;
using APT.MS.Domain.Enums;
using APT.Utility;
using Castle.Core.Internal;
using Microsoft.AspNetCore.Mvc;
using NPOI.SS.Formula.Functions;
using System;
using System.Collections.Generic;
using System.Linq;
namespace APT.SC.WebApi.Controllers.Api.PTController
{
    /// 
    ///  检测与考核记录
    /// 
    [Route("api/PT/PTMonitorAssessment")]
    public partial class MonitorAssessmentController : AuthorizeApiController
    {
        IPFCodeRuleService CodeRuleService { get; set; }
        IFMNotificationTaskService NotificationTaskService { get; set; }
        IFMFlowPermitService MFlowPermitService { get; set; }
        IPFApproveCallBackService ApproveCallBackService { get; set; }
        /// 
        /// 
        /// 
        /// 
        public MonitorAssessmentController(IPFCodeRuleService codeRuleService, IFMNotificationTaskService notificationTaskService, IFMFlowPermitService mFlowPermitService, IPFApproveCallBackService approveCallBackService)
        {
            CodeRuleService = codeRuleService;
            NotificationTaskService = notificationTaskService;
            MFlowPermitService = mFlowPermitService;
            ApproveCallBackService = approveCallBackService;
        }
        /// 
        /// 新增/编辑
        /// 
        /// 
        /// 
        [HttpPost, Route("FullUpdate")]
        public JsonActionResult FullUpdate([FromBody] T_PT_MONITOR_ASSESSMENT entity)
        {
            return SafeExecute(() =>
            {
                var details = entity.Nav_Details;
                //if (details != null && details.Any())
                //{
                //    details= details.Where(t=>!t.IS_DELETED).ToList();
                //}
                var users = entity.Nav_MonitorUser;
                //if (users != null && users.Any())
                //{
                //    users = users.Where(t => !t.IS_DELETED).ToList();
                //}
                entity.STATUS = PFStandardStatus.Draft;
                entity.YEAR = DateTime.Now.Year.ToString();
                var loginUserId = entity.USER_ID!=null? entity.USER_ID:APT.Infrastructure.Api.AppContext.CurrentSession.UserID;
                if (entity.TaskID != Guid.Empty)
                {
                    var currTask = GetEntity(t => t.ID == entity.TaskID);
                    if (currTask != null)
                    {
                        loginUserId = currTask.USER_ID;
                    }
                }
                entity.USER_ID = loginUserId;
                var userInfos = this.GetEntities(t => t.ENABLE_STATUS == 0,new BaseFilter(entity.ORG_ID));
                var departInfos = this.GetEntities(t => t.ENABLE_STATUS == 0, new BaseFilter(entity.ORG_ID));
                //var departmentId = userInfo?.DEPARTMENT_ID;
                entity.DEPARTMENT_ID = this.GetEntity(t => t.ENABLE_STATUS == 0 && t.ID == (Guid)loginUserId)?.DEPARTMENT_ID;
                List  notices = null;
                List contents = new List();
                T_FM_NOTIFICATION_TASK task = null;
                if (details != null && details.Any())
                {
                    details.ForEach(t =>
                    {
                        var depart = departInfos.FirstOrDefault(m => m.ID == t.DEPARTMENT_ID);
                        var user = userInfos.FirstOrDefault(m => m.ID == t.USER_ID);
                        t.ORG_ID = entity.ORG_ID; t.MONITOR_ASSESSMENT_ID = entity.ID;
                        if (!t.IS_DELETED)
                        {
                            if (t.Nav_Contents != null && t.Nav_Contents.Any())
                            {
                                t.Nav_Contents.ForEach(t1 =>
                                {
                                    if (t1.RESULT_SCORE == null)
                                    {
                                        throw new Exception(depart?.NAME + "  " + user?.NAME + "必须填写得分");
                                    }
                                    if (t1.RESULT_SCORE > t1.SCORE)
                                    {
                                        throw new Exception(depart?.NAME + "  " + user?.NAME + "得分不能大于标准分");
                                    }
                                    t1.ORG_ID = entity.ORG_ID;
                                    t1.MONITOR_ASSESSMENT_DETAIL_ID = t.ID;
                                    contents.Add(t1);
                                });
                                t.Nav_Contents = null;
                            }
                            else
                            {
                                throw new Exception(depart?.NAME + "  " + user?.NAME + "指标考核项目不能为空");
                            }
                        }
                        else
                        {
                            if (t.Nav_Contents != null && t.Nav_Contents.Any())
                            {
                                t.Nav_Contents.ForEach(t1 =>
                                {
                                    t1.IS_DELETED = true;
                                    t1.ORG_ID = entity.ORG_ID;
                                    t1.MONITOR_ASSESSMENT_DETAIL_ID = t.ID;
                                    contents.Add(t1);
                                });
                                t.Nav_Contents = null;
                            }
                        }
                    });
                }
                if (users != null && users.Any())
                {
                    users.ForEach(t =>
                    {
                        t.ORG_ID = entity.ORG_ID; t.MONITOR_ASSESSMENT_ID = entity.ID;
                    });
                }
                if (entity.PUBLISH != null && entity.PUBLISH.Equals("SaveAndNotify"))
                {
                    entity.STATUS = PFStandardStatus.Sign;
                    var name = Enum.GetName(typeof(FMDepartmentType), entity.DEPARTMENT_TYPE);
                    var cycleName = entity.ASSESSMENT_CYCLE.GetDescription();
                    var userIds = users.Where(x=>x.USER_ID!=null).Select(t => t.USER_ID.Value).Distinct().ToList();
                    if (userIds != null && userIds.Any())
                    {
                        var userNames = new List();
                        var userInfoTemps = userInfos.Where(t => userIds.Contains(t.ID));
                        foreach (var user in userIds)
                        {
                            var current = userInfoTemps.FirstOrDefault(t => t.ID == user);
                            userNames.Add(current?.NAME);
                        }
                        //发消息
                        notices = NotificationTaskService.InsertUserNoticeTaskModels("("+cycleName +")"+ name + "监测与考核记录-确认", entity.ID, entity.ORG_ID, userIds, userNames, DateTime.Now,
                        DateTime.Now.AddHours(24), (int)FMNoticeTypeEnum.消息, "PT029_SHOWPRINT");
                    }
                    if (entity.TaskID != Guid.Empty)
                    {
                        task = NotificationTaskService.GetTaskFinishModel(entity.TaskID);
                        task.SOURCE_FORMCODE = "PT029_SHOWPRINT";
                    }
                }
                entity.Nav_Details = null;
                entity.Nav_MonitorUser = null;
                UnifiedCommit(() =>
                {
                    if (entity != null)
                        this.UpdateEntityNoCommit(entity);
                    if (details != null && details.Any())
                        this.BantchSaveEntityNoCommit(details);
                    if (users != null && users.Any())
                        this.BantchSaveEntityNoCommit(users);
                    if (contents != null && contents.Any())
                        this.BantchSaveEntityNoCommit(contents);
                    if (task != null)
                        this.UpdateEntityNoCommit(task);
                    if (notices != null && notices.Any())
                        this.BantchSaveEntityNoCommit(notices);
                });
                return true;
            });
        }
        /// 
        /// 已阅
        /// 
        /// 
        /// 
        [HttpPost, Route("IdentityUpdate")]
        public JsonActionResult IdentityUpdate([FromBody] T_PT_MONITOR_ASSESSMENT entity)
        {
            return SafeExecute(() => {
                var monitor = this.GetEntity(entity.ID, "Nav_MonitorUser");
                var userId = APT.Infrastructure.Api.AppContext.CurrentSession.UserID;
                //if (entity.TaskID != Guid.Empty)
                //{
                //    var currTask = GetEntity(t => t.ID == entity.TaskID);
                //    if (currTask != null)
                //    {
                //        userId = currTask.USER_ID;
                //    }
                //}
                var user = this.GetEntity(t => t.MONITOR_ASSESSMENT_ID == monitor.ID && t.USER_ID == userId, new BaseFilter(monitor.ORG_ID));
                if(user != null)
                    user.DEAL_STATUS = FOUserShiftStatusEnum.已处理;
                T_FM_NOTIFICATION_TASK task = null;
                var todoCount = this.GetCount(t => t.MONITOR_ASSESSMENT_ID == monitor.ID && t.DEAL_STATUS == 0 && t.USER_ID != userId, new BaseFilter(monitor.ORG_ID));
                var approve = this.GetCount(t => t.DATA_ID == monitor.ID && t.APPROVE_STATUS == 10 , new BaseFilter(monitor.ORG_ID));
                if (todoCount == 0 && approve == 0)
                {
                    monitor.STATUS = PFStandardStatus.Approving;
                    var sysFilter = new SystemCodeFilter();
                    sysFilter.CodeType = (int)PFCodeRuleType.审批流编码;
                    sysFilter.Count = 1;
                    sysFilter.OrgId = monitor.ORG_ID;
                    var codes = CodeRuleService.NewGenSerial(sysFilter);
                    var serialCode = codes.Split(new char[] { ',' });
                    var param = Enum.GetName(typeof(FMDepartmentType), monitor.DEPARTMENT_TYPE);
                    MFlowPermitService.InsertApprove(serialCode[0], "PT029", param, entity.ID, "PT029_SHOWPRINT", entity.TaskID, true, () =>
                    {
                        if (monitor != null)
                            this.UpdateEntityNoCommit(monitor);
                        if (user != null)
                            this.UpdateEntityNoCommit(user);
                        if (task != null)
                            this.UpdateEntityNoCommit(task);
                    }, null, null, null, null, null, "PT029_SHOWPRINT", null);
                    return true;
                }
                if (entity.TaskID != Guid.Empty)
                {
                    task = NotificationTaskService.GetTaskFinishModel(entity.TaskID);
                    task.SOURCE_FORMCODE = "PT029_SHOWPRINT";
                }
                UnifiedCommit(() =>
                {
                    if (monitor != null)
                        this.UpdateEntityNoCommit(monitor);
                    if (user != null)
                        this.UpdateEntityNoCommit(user);
                    if (task != null)
                        this.UpdateEntityNoCommit(task);
                });
                return true;
            });
        }
        /// 
        /// 已阅
        /// 
        /// 
        /// 
        [HttpPost, Route("IdentityUpdateOld")]
        public JsonActionResult IdentityUpdateOld([FromBody] T_PT_MONITOR_ASSESSMENT entity)
        {
            return SafeExecute(() => {
                var monitor = this.GetEntity(entity.ID);
                var chargeUserIds = new List();
                var chargeUserId = new Guid?();
                var parentId = this.GetEntity(t => t.ID == monitor.DEPARTMENT_ID.Value)?.PARENT_ID;
                if(parentId != null)
                    chargeUserId = this.GetEntity(t => t.ID == parentId)?.USER_ID;
                if(monitor.DEPARTMENT_TYPE == FMDepartmentType.Department)
                    chargeUserId = this.GetEntity(t => t.APPROVE_ROLE_ID != null && t.Nav_ApproveRole.NAME == "安环部负责人" && t.ENABLE_STATUS == 0)?.ID;
                if (monitor.DEPARTMENT_TYPE == FMDepartmentType.Company)
                    chargeUserId = this.GetEntity(t => t.APPROVE_ROLE_ID != null && t.Nav_ApproveRole.NAME == "总经理" && t.ENABLE_STATUS == 0)?.ID;
                List notices = new List();
                T_FM_NOTIFICATION_TASK task = null;
                if (chargeUserId != null)
                {
                    if (monitor != null)
                        monitor.STATUS = PFStandardStatus.Archived;
                    chargeUserIds.Add(chargeUserId.Value);
                    var name = Enum.GetName(typeof(FMDepartmentType), monitor.DEPARTMENT_TYPE);
                    var userNames = new List();
                    var user = this.GetEntity(t => t.ENABLE_STATUS == (int)FMEnableStatusEnum.启用 && chargeUserIds.Contains(t.ID));
                    userNames.Add(user?.NAME);
                    notices = NotificationTaskService.InsertUserNoticeTaskModels(name + "监测与考核记录", monitor.ID, monitor.ORG_ID, chargeUserIds, userNames, DateTime.Now,
                      DateTime.Now.AddHours(24), (int)FMNoticeTypeEnum.消息, "PT029_SHOWPRINT");//userIds, userNames,
                    if (entity.TaskID != Guid.Empty)
                    {
                        task = NotificationTaskService.GetTaskFinishModel(entity.TaskID);
                        task.SOURCE_FORMCODE = "PT029_SHOWPRINT";
                    }
                }
                UnifiedCommit(() =>
                {
                    if (monitor != null)
                        this.UpdateEntityNoCommit(monitor);
                    if (notices != null && notices.Any())
                        this.BantchSaveEntityNoCommit(notices);
                    if (task != null)
                        this.UpdateEntityNoCommit(task);
                });
                return true;
            });
        }
        /// 
        /// 负责人签阅
        /// 
        /// 
        /// 
        [HttpPost, Route("ChargeAgree")]
        public JsonActionResult ChargeAgree([FromBody] T_PT_MONITOR_ASSESSMENT entity)
        {
            return SafeExecute(() => {
                T_FM_NOTIFICATION_TASK task = null;
                if (entity.TaskID != Guid.Empty)
                {
                    task = NotificationTaskService.GetTaskFinishModel(entity.TaskID);
                    task.SOURCE_FORMCODE = "PT029_SHOWPRINT";
                }
                UnifiedCommit(() =>
                {
                    if (task != null)
                        this.UpdateEntityNoCommit(task);
                });
                return true;
            });
        }
        /// 
        /// 获取
        /// 
        /// 
        /// 
        [HttpPost, Route("GetEdit")]
        public JsonActionResult GetEdit([FromBody] KeywordFilter filter)
        {
            return SafeExecute(() => {
                var id = filter.FilterGroup.Rules.FirstOrDefault(t => t.Field == "ID").Value.ToString();
                if (string.IsNullOrEmpty(id))
                    this.ThrowError("030017");
                var result = this.GetEntity(id, new string[] { "Nav_User","Nav_MonitorUser", "Nav_Department","Nav_Department.Nav_User",
            "Nav_Details","Nav_Details.Nav_Department","Nav_Details.Nav_Department.Nav_User","Nav_Details.Nav_Contents","Nav_Details.Nav_User",
                    "Nav_Details.Nav_User.Nav_Person","Nav_Details.Nav_User.Nav_Person.Nav_Post","Nav_MonitorUser.Nav_User","Nav_MonitorUser.Nav_User"});
                if (result != null && result.Nav_Details != null && result.Nav_Details.Any())
                {
                    result.Nav_Details = result.Nav_Details.OrderBy(t => t.USER_ID).ToList();
                    if (result.STATUS == PFStandardStatus.Rejected)
                    {
                        result.CONTEXT = ApproveCallBackService.RejectContent(result.ID);
                    }
                }
                return result;
            });
        }
        /// 
        /// 回调函数
        /// 
        /// 
        /// 
        [HttpGet, Route("BackUpdate")]
        public JsonActionResult BackUpdate(string id)
        {
            return SafeExecute(() =>
            {
                return ApproveCallBackService.CallBack("PT/PTMonitorAssessment/BackUpdate", id);
            });
        }
        /// 
        /// 排序分页查询数据
        /// 
        /// 分页过滤实体
        /// 
        [HttpPost, Route("OrderPagedSummary")]
        public PagedActionResult OrderPagedSummary([FromBody] KeywordPageFilter pageFilter)
        {
            var result = this.GetOrderPageEntities(null,pageFilter);
            if (result.Data != null)
            {
                result.Data = result.Data.GroupBy(t => t.YEAR).Select(m=>m.FirstOrDefault()).ToList();
                result.TotalCount = result.Data.Count();
            }
            return result;
        }
        /// 
        /// 排序分页查询数据
        /// 
        /// 分页过滤实体
        /// 
        [HttpPost, Route("OrderPagedDetail")]
        public PagedActionResult OrderPagedDetail([FromBody] KeywordPageFilter pageFilter)
        {
            pageFilter.IgnoreDataRule = true;
            var id = pageFilter.FilterGroup.Rules.FirstOrDefault(t => t.Field == "ID");
            if (string.IsNullOrEmpty(id.Value.ToString()))
                this.ThrowError("030017");
            else
                pageFilter.FilterGroup.Rules.Remove(id);
            var year = this.GetEntity(id.Value.ToString()).YEAR;
            var newFilter = new BaseFilter(pageFilter.OrgId);
            newFilter.IgnoreDataRule = true;
            newFilter.SelectField = new List { "ID" };
            var monitors = this.GetEntities(t => t.YEAR == year, newFilter);
            var monitorIds = monitors.Select(t => t.ID).ToList();
            pageFilter.Include.Add("Nav_Contents");
            var result = this.GetOrderPageEntities(t=> monitorIds.Contains(t.MONITOR_ASSESSMENT_ID), pageFilter);
            if (result.Data != null)
            {
                var contentIds = result.Data.Select(t => t.ID).ToList();
                var contentList = GetEntities(t => contentIds.Contains(t.MONITOR_ASSESSMENT_DETAIL_ID),new BaseFilter(pageFilter.OrgId));
                result.Data.ForEach(t =>
                {
                    var content = contentList.Where(m => m.MONITOR_ASSESSMENT_DETAIL_ID == t.ID).ToList();
                    if (t.Nav_Contents != null && t.Nav_Contents.Any())
                    {
                        t.SCORE = content.Where(m => m.RESULT_SCORE != null).Sum(t => t.RESULT_SCORE).ToString();
                    }
                });
            }
            return result;
        }
        /// 
        /// 驳回
        /// 
        /// 
        /// 
        [HttpPost, Route("RejectUpdate")]
        public JsonActionResult RejectUpdate([FromBody] T_PF_APPROVE model)
        {
            return SafeExecute(() =>
            {
                //公共 获取审批流信息
                T_PF_APPROVE modelApp = null;
                List listAppDetail = null;
                T_FM_NOTIFICATION_TASK taskFinish = null;
                string Msg = string.Empty;
                bool ResultGetInfo = ApproveCallBackService.GetApproject(model, ref modelApp, ref listAppDetail, ref taskFinish, ref Msg);
                if (!ResultGetInfo)
                    throw new Exception("驳回失败!");
                if (modelApp == null || listAppDetail == null)
                    throw new Exception("获取驳回信息失败!");
                var entity = this.GetEntity(model.DATA_ID, new string[] { "Nav_User" });
                entity.STATUS = PFStandardStatus.Rejected;
                var persons = this.GetEntities(t => t.MONITOR_ASSESSMENT_ID == model.DATA_ID, new BaseFilter(entity.ORG_ID));
                if (persons.Any())
                    persons.ForEach(t => { t.DEAL_STATUS = 0; t.Nav_User = null; });
                //直接驳回给申请人
                T_FM_NOTIFICATION_TASK notice = NotificationTaskService.InsertUserNoticeTaskModel("监测与考核记录已被驳回", entity.ID, entity.ORG_ID, (Guid)entity.USER_ID, entity.Nav_User.NAME, DateTime.Now,
                DateTime.Now.AddHours(24), (int)FMNoticeTypeEnum.消息, "PT029");
               
                UnifiedCommit(() =>
                {
                    if (entity != null)
                        this.UpdateEntityNoCommit(entity);
                    if (notice != null)
                        this.UpdateEntityNoCommit(notice);
                    if (modelApp != null)
                        UpdateEntityNoCommit(modelApp);
                    if (listAppDetail != null && listAppDetail.Count > 0)
                        BantchUpdateEntityNoCommit(listAppDetail);
                    if (persons != null && persons.Any())
                        BantchUpdateEntityNoCommit(persons);
                    if (taskFinish != null)
                        UpdateEntityNoCommit(taskFinish);
                });
                return true;
                //return ApproveCallBackService.CallReject("FO/FOCrucialLicenseJob/RejectUpdate", id);
            });
        }
    }
}