using APT.BaseData.Domain.Entities;
using APT.BaseData.Domain.Entities.FM;
using APT.BaseData.Domain.Entities.PF;
using APT.BaseData.Domain.Enums;
using APT.Infrastructure.Core;
using APT.MS.Domain.Entities.BS;
using APT.MS.Domain.Entities.HM;
using APT.MS.Domain.Entities.PF;
using APT.MS.Domain.Entities.SC;
using APT.MS.Domain.Enums;
using APT.Utility;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
namespace APT.PF.WebApi.Controllers.Api
{
    /// 
    ///  审批角色
    /// 
    [Route("api/PF/PFApprovalRole")]
    public partial class ApprovalRoleController : AuthorizeApiController
    {
        /// 
        /// 更新或新增数据
        /// 
        /// 对象实体
        /// 
        [HttpPost, Route("FullUpdate")]
        public JsonActionResult FullUpdate([FromBody] T_PF_APPROVAL_ROLE entity)
        {
            return SafeExecute(() =>
            {
                var orgId = APT.Infrastructure.Api.AppContext.CurrentSession.OrgId;
                //var roleCodes = this.GetEntities(t => true, new BaseFilter(orgId)).Select(x => x.NAME).ToList();
                //if (roleCodes.Contains(entity.NAME))
                //    throw new Exception("系统已存在审批角色编码为" + entity.NAME + "的数据,请勿重复!");
                var departs = entity.Nav_ApproveDeparts;
                entity.Nav_ApproveDeparts = null;
                if (departs != null && departs.Any())
                {
                    departs = departs.Where(t => !t.IS_DELETED).ToList();
                }
                if (departs != null && departs.Any())
                {
                    departs.ForEach(t =>
                    {
                        t.ORG_ID = orgId;
                        t.APPROVAL_ROLE_ID = entity.ID;
                        t.Nav_Department = null;
                    });
                }
                List listRoles = new List();
                var roles = entity.Nav_ApproveRoles;
                entity.Nav_ApproveRoles = null;
                if (roles == null)
                {
                    var approveRole = this.GetEntity(t => t.ENABLE_STATUS == 0 && t.NAME.Contains("负责人"));
                    if (approveRole != null)
                    {
                        var role = new T_PF_APPROVE_OPERATION_ROLE();
                        role.ORG_ID = orgId;
                        role.APPROVAL_ROLE_ID = entity.ID;
                        role.ROLE_ID = approveRole.ID;
                        listRoles.Add(role);
                    }
                }
                List  deleteIds = new List();
                if (entity.ROLE_ID != null)
                {
                    var datas = this.GetEntities(t => t.APPROVAL_ROLE_ID == entity.ID, new BaseFilter(orgId));
                    if (datas.Any())
                    { 
                        var ids=datas.Select(t => t.ID).ToList();
                        deleteIds.AddRange(ids);
                    }
                    var role = new T_PF_APPROVE_OPERATION_ROLE();
                    role.ORG_ID = orgId;
                    role.APPROVAL_ROLE_ID = entity.ID;
                    role.ROLE_ID = entity.ROLE_ID;
                    listRoles.Add(role);
                }
                if (listRoles.Any())
                {
                    listRoles = listRoles.Distinct(t => t.ROLE_ID).ToList();
                }
                UnifiedCommit(() =>
                {
                    if (entity != null)
                        UpdateEntityNoCommit(entity);   //保存主表
                    if (departs != null && departs.Any())
                        BantchSaveEntityNoCommit(departs);    //保存子表
                    if (listRoles != null && listRoles.Any())
                        BantchSaveEntityNoCommit(listRoles);    //保存子表
                    if (deleteIds != null && deleteIds.Any())
                        BantchDeleteEntityNoCommit(deleteIds);    //保存子表
                });
                return true;
            });
        }
        /// 
        /// 批量添加节点
        /// 
        /// 参数
        /// 
        [HttpPost, Route("AddApproveRoles")]
        public JsonActionResult AddApproveRoles([FromBody] KeywordFilter keywordFilter)
        {
            return base.SafeExecute(() =>
            {
                if (string.IsNullOrEmpty(keywordFilter.Parameter1))
                    throw new Exception("当前节点未选择!");
                if (string.IsNullOrEmpty(keywordFilter.Parameter2) && string.IsNullOrEmpty(keywordFilter.Parameter3))
                    throw new Exception("上一节点和下一节点至少选择一个");
                List detailNews = new List();
                Guid newID = new Guid(keywordFilter.Parameter1);
                var approveDetailTemps = this.GetEntities(t => !t.IS_DELETED, new BaseFilter(keywordFilter.OrgId));
                var approveIds = approveDetailTemps.Select(t => t.APPROVE_ID).Distinct().ToList();
                Guid? preID = null;
                var approvalRole = this.GetEntity(t => t.ID == newID);
                if (!string.IsNullOrEmpty(keywordFilter.Parameter2))
                {
                    preID = new Guid(keywordFilter.Parameter2);
                    if (newID == preID)
                    {
                        throw new Exception("当前节点和上一节点不能相同");
                    }
                }
                Guid? nextID = null;
                if (!string.IsNullOrEmpty(keywordFilter.Parameter3))
                {
                    nextID = new Guid(keywordFilter.Parameter3);
                    if (newID == preID)
                    {
                        throw new Exception("当前节点和下一节点不能相同");
                    }
                }
                if (preID != null && nextID != null && preID == nextID)
                {
                    throw new Exception("上一节点和下一节点不能相同");
                }
                if (approveIds != null && approveIds.Any())
                {
                    foreach (var item in approveIds)
                    {
                        var temps = approveDetailTemps.Where(t => t.APPROVE_ID == item).OrderBy(m => m.NUM).ToList();
                        if (temps.Any())
                        {
                            var isExiest = temps.FirstOrDefault(t => t.APPROVE_ROLE_ID == newID);
                            if (isExiest == null)
                            {
                                if (preID != null && nextID != null)
                                {
                                    var pre = temps.FirstOrDefault(t => t.APPROVE_ROLE_ID == preID);
                                    var next = temps.FirstOrDefault(t => t.APPROVE_ROLE_ID == nextID);
                                    if (pre != null && next != null)
                                    {
                                        var nextTemp = temps.Where(m => m.NUM > pre.NUM).OrderBy(t => t.NUM).FirstOrDefault();
                                        if (next.NUM == nextTemp.NUM)
                                        {
                                            T_PF_APPROVE_TEMP_DETAIL detailNew = new T_PF_APPROVE_TEMP_DETAIL();
                                            detailNew.ID = Guid.NewGuid();
                                            detailNew.ORG_ID = keywordFilter.OrgId;
                                            detailNew.APPROVE_ID = item;
                                            detailNew.APPROVE_ROLE_ID = newID;
                                            detailNew.NUM = next.NUM;
                                            detailNew.DEPARTMENT_TYPE = approvalRole.DEPARTMENT_TYPE;
                                            detailNew.NAME = approvalRole.NAME;
                                            temps.Add(detailNew);
                                            temps.Where(t => t.NUM >= detailNew.NUM && t.APPROVE_ROLE_ID != newID).ForEach(m => { m.NUM = m.NUM + 1; });
                                            detailNews.AddRange(temps);
                                        }
                                    }
                                }
                                else if (preID != null && nextID == null)
                                {
                                    var pre = temps.FirstOrDefault(t => t.APPROVE_ROLE_ID == preID);
                                    if (pre != null)
                                    {
                                        T_PF_APPROVE_TEMP_DETAIL detailNew = new T_PF_APPROVE_TEMP_DETAIL();
                                        detailNew.ID = Guid.NewGuid();
                                        detailNew.ORG_ID = keywordFilter.OrgId;
                                        detailNew.APPROVE_ID = item;
                                        detailNew.APPROVE_ROLE_ID = newID;
                                        detailNew.NUM = pre.NUM + 1;
                                        detailNew.DEPARTMENT_TYPE = approvalRole.DEPARTMENT_TYPE;
                                        detailNew.NAME = approvalRole.NAME;
                                        temps.Add(detailNew);
                                        temps.Where(t => t.NUM >= detailNew.NUM && t.APPROVE_ROLE_ID != newID).ForEach(m => { m.NUM = m.NUM + 1; });
                                        detailNews.AddRange(temps);
                                    }
                                }
                                else if (preID == null && nextID != null)
                                {
                                    var next = temps.FirstOrDefault(t => t.APPROVE_ROLE_ID == nextID);
                                    if (next != null)
                                    {
                                        T_PF_APPROVE_TEMP_DETAIL detailNew = new T_PF_APPROVE_TEMP_DETAIL();
                                        detailNew.ID = Guid.NewGuid();
                                        detailNew.ORG_ID = keywordFilter.OrgId;
                                        detailNew.APPROVE_ID = item;
                                        detailNew.APPROVE_ROLE_ID = newID;
                                        detailNew.NUM = next.NUM;
                                        detailNew.DEPARTMENT_TYPE = approvalRole.DEPARTMENT_TYPE;
                                        detailNew.NAME = approvalRole.NAME;
                                        temps.Add(detailNew);
                                        temps.Where(t => t.NUM >= detailNew.NUM && t.APPROVE_ROLE_ID != newID).ForEach(m => { m.NUM = m.NUM + 1; });
                                        detailNews.AddRange(temps);
                                    }
                                }
                            }
                        }
                    }
                }
                UnifiedCommit(() =>
                {
                    if (detailNews != null && detailNews.Any())
                        this.BantchSaveEntityNoCommit(detailNews);
                });
                return true;
            });
        }
    }
}