using APT.BaseData.Domain.ApiModel.PF;
using APT.BaseData.Domain.Entities;
using APT.BaseData.Domain.Entities.FM;
using APT.BaseData.Domain.Enums;
using APT.BaseData.Domain.IServices;
using APT.BaseData.Domain.IServices.FM;
using APT.Infrastructure.Core;
using APT.MS.Domain.Entities.BS;
using APT.MS.Domain.Entities.HM;
using APT.MS.Domain.Enums;
using APT.Utility;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
namespace APT.BS.WebApi.Controllers.Api
{
    /// 
    /// 
    /// 
    [Route("api/FM/FMUser")]
    public partial class FMUserController : AuthorizeApiController
    {
        IFMUserService UserService { get; set; }
        public FMUserController(IFMUserService userService)
        {
            UserService = userService;
        }
        /// 
        /// 正常使用的用户
        /// 重写  api/FM/User/OrderPaged
        /// 目前最多只支持4个生产单元有重叠的
        /// 
        /// 
        /// 
        [HttpPost, Route("OrderPagedUseful")]
        public PagedActionResult OrderPagedUseful([FromBody] KeywordPageFilter pageFilter)
        {
            if (string.IsNullOrEmpty(pageFilter.Parameter1))
            {
                List listMineType = new List();
                Guid DEPARTMENT_ID_WORKSHOP = Guid.Empty;
                Guid DEPARTMENT_ID = Guid.Empty;
                if (pageFilter.FilterGroup.Rules.Count == 2)
                {
                    foreach (var item in pageFilter.FilterGroup.Rules)
                    {
                        if (item.Field == "DEPARTMENT_ID_WORKSHOP")
                        {
                            DEPARTMENT_ID_WORKSHOP = new Guid(item.Value.ToString());
                        }
                        else if (item.Field == "DEPARTMENT_ID")
                        {
                            DEPARTMENT_ID = new Guid(item.Value.ToString());
                        }
                    }
                }
                bool isMintype = false;//是否 区分生产单元
                if (pageFilter.FilterGroup.Groups != null && pageFilter.FilterGroup.Groups.Any())
                {
                    var groups = pageFilter.FilterGroup.Groups.ToList();
                    string MineType = string.Empty;
                    if (groups[0].Rules != null && groups[0].Rules.Any())
                    {
                        FilterRule ruleType = null;
                        foreach (var rule in groups[0].Rules)
                        {
                            if (rule.Field == "MineType")
                            {
                                ruleType = rule;
                                MineType = rule.Value.ToString();
                                isMintype = true;
                                break;
                            }
                        }
                        if (!string.IsNullOrEmpty(MineType))
                        {
                            listMineType = UserService.GetMineType(MineType);
                            if (ruleType != null)
                            {
                                groups[0].Rules.Remove(ruleType);
                                pageFilter.FilterGroup.Groups = groups;
                            }
                        }
                    }
                }
                if (isMintype)
                {
                    return SafeGetPagedData(delegate (PagedActionResult result)
                    {
                        Expression> expression = e => e.ENABLE_STATUS == 0 && !e.CODE.StartsWith("admin");// && e.CODE != "admin";
                        //linq 运行不通过  修改为查找后内存中过滤
                        //expression = expression.And(e => e.Nav_ProdutionUnit == null || (e.Nav_ProdutionUnit.Any() && e.Nav_ProdutionUnit.Where(x => listMineType.Contains(x.Nav_Enums.VALUE)) != null));
                        //PagedActionResult orderPageEntities = GetOrderPageEntities(expression, pageFilter, "Nav_ProdutionUnit.Nav_Enums");
                        //result.Data = orderPageEntities.Data;
                        //result.TotalCount = orderPageEntities.TotalCount;
                        //var resultListUser = GetEntities(expression, pageFilter, "Nav_ProdutionUnit.Nav_Enums");//这样不行
                        pageFilter.SelectField.Add("Nav_ProdutionUnit.Nav_Enums");
                        var resultListUser = GetEntities(expression, pageFilter);
                        if (resultListUser != null && resultListUser.Any())
                        {
                            IEnumerable resultListUserFilter = null;
                            if (listMineType.Count > 0)
                            {
                                if (listMineType.Count == 1)
                                {
                                    resultListUserFilter = resultListUser.Where(e => e.Nav_ProdutionUnit == null || (e.Nav_ProdutionUnit.Any() && e.Nav_ProdutionUnit.Where(x => x.Nav_Enums != null && listMineType[0] == x.Nav_Enums.VALUE).Any()));// != null
                                }
                                else
                                {
                                    resultListUserFilter = resultListUser.Where(e => e.Nav_ProdutionUnit == null || (e.Nav_ProdutionUnit.Any() && e.Nav_ProdutionUnit.Where(x => x.Nav_Enums != null && listMineType.Contains(x.Nav_Enums.VALUE)) != null));
                                }
                            }
                            if (resultListUserFilter != null && resultListUserFilter.Any())
                            {
                                result.Data = resultListUserFilter.Skip((pageFilter.PageIndex - 1) * pageFilter.Limit).Take(pageFilter.Limit);
                                result.TotalCount = resultListUserFilter.Count();
                            }
                        }
                        if (result.Data == null || !result.Data.Any())
                        {
                            result.Data = new List();
                            result.TotalCount = 0;
                        }
                    });
                }
                else if (DEPARTMENT_ID_WORKSHOP != Guid.Empty && DEPARTMENT_ID != Guid.Empty)
                {
                    pageFilter.FilterGroup.Rules.Clear();
                    return SafeGetPagedData(delegate (PagedActionResult result)
                    {
                        PagedActionResult orderPageEntities = GetOrderPageEntities(e => e.ENABLE_STATUS == 0 && e.CODE != "admin" && e.DEPARTMENT_ID == DEPARTMENT_ID_WORKSHOP || (e.Nav_Department.PARENT_ID.HasValue && e.Nav_Department.PARENT_ID == DEPARTMENT_ID_WORKSHOP), pageFilter, new string[] { "Nav_Department" });
                        result.Data = orderPageEntities.Data;
                        result.TotalCount = orderPageEntities.TotalCount;
                    });
                }
                else
                {
                    return WitOrderPaged(e => e.ENABLE_STATUS == 0 && e.CODE != "admin", pageFilter);
                }
                #region    旧
                //List listMineType = new List();
                //List listMineTypeTemp = new List();
                //Guid DEPARTMENT_ID_WORKSHOP = Guid.Empty;
                //Guid DEPARTMENT_ID = Guid.Empty;
                //if (pageFilter.FilterGroup.Rules.Count == 2)
                //{
                //    foreach (var item in pageFilter.FilterGroup.Rules)
                //    {
                //        if (item.Field == "DEPARTMENT_ID_WORKSHOP")
                //        {
                //            DEPARTMENT_ID_WORKSHOP = new Guid(item.Value.ToString());
                //        }
                //        else if (item.Field == "DEPARTMENT_ID")
                //        {
                //            DEPARTMENT_ID = new Guid(item.Value.ToString());
                //        }
                //    }
                //}
                //if (pageFilter.FilterGroup.Groups != null && pageFilter.FilterGroup.Groups.Any())
                //{
                //    var groups = pageFilter.FilterGroup.Groups.ToList();
                //    string MineType = string.Empty;
                //    if (groups[0].Rules != null && groups[0].Rules.Any())
                //    {
                //        FilterRule ruleType = null;
                //        foreach (var rule in groups[0].Rules)
                //        {
                //            if (rule.Field == "MineType")
                //            {
                //                ruleType = rule;
                //                MineType = rule.Value.ToString();
                //                break;
                //            }
                //        }
                //        if (!string.IsNullOrEmpty(MineType))
                //        {
                //            if (ruleType != null)
                //            {
                //                groups[0].Rules.Remove(ruleType);
                //                pageFilter.FilterGroup.Groups = groups;
                //            }
                //            if (MineType.IndexOf(",") > -1)
                //            {
                //                listMineTypeTemp = MineType.Split(',', StringSplitOptions.RemoveEmptyEntries).Distinct().ToList();
                //                listMineType.AddRange(listMineTypeTemp);
                //            }
                //            string strTemp = string.Empty;
                //            if (!listMineType.Contains(MineType))
                //            {
                //                listMineType.Add(MineType);
                //                if (listMineTypeTemp.Count > 2)//多个生产单元  
                //                {
                //                    for (int i = 0; i < listMineTypeTemp.Count; i++)
                //                    {
                //                        for (int j = 0; j < listMineTypeTemp.Count; j++)
                //                        {
                //                            strTemp = listMineTypeTemp[i] + "," + listMineTypeTemp[j];
                //                            if (!listMineType.Contains(strTemp))
                //                            {
                //                                listMineType.Add(strTemp);
                //                            }
                //                        }
                //                    }
                //                }
                //                if (listMineTypeTemp.Count > 3)
                //                {
                //                    for (int i = 0; i < listMineTypeTemp.Count; i++)
                //                    {
                //                        for (int j = 0; j < listMineTypeTemp.Count; j++)
                //                        {
                //                            for (int k = 0; k < listMineTypeTemp.Count; k++)
                //                            {
                //                                strTemp = listMineTypeTemp[i] + "," + listMineTypeTemp[j] + "," + listMineTypeTemp[k];
                //                                if (!listMineType.Contains(strTemp))
                //                                {
                //                                    listMineType.Add(strTemp);
                //                                }
                //                            }
                //                        }
                //                    }
                //                }
                //            }
                //        }
                //    }
                //}
                //if (listMineType.Count > 0)
                //{
                //    return SafeGetPagedData(delegate (PagedActionResult result)
                //    {
                //        Expression> expression = e => e.ENABLE_STATUS == 0 && e.CODE != "admin";
                //        if (listMineType.Count == 1)
                //        {
                //            if (!string.IsNullOrEmpty(listMineType[0]))
                //            {
                //                expression = expression.And(e => e.MineType != null && e.MineType.Contains(listMineType[0]));
                //            }
                //        }
                //        else
                //        {
                //            expression = expression.And(e => e.MineType != null && listMineType.Contains(e.MineType));
                //        }
                //        PagedActionResult orderPageEntities = GetOrderPageEntities(expression, pageFilter, null);
                //        result.Data = orderPageEntities.Data;
                //        result.TotalCount = orderPageEntities.TotalCount;
                //    });
                //}
                //else if (DEPARTMENT_ID_WORKSHOP != Guid.Empty && DEPARTMENT_ID != Guid.Empty)
                //{
                //    pageFilter.FilterGroup.Rules.Clear();
                //    return SafeGetPagedData(delegate (PagedActionResult result)
                //    {
                //        PagedActionResult orderPageEntities = GetOrderPageEntities(e => e.ENABLE_STATUS == 0 && e.CODE != "admin" && e.DEPARTMENT_ID == DEPARTMENT_ID_WORKSHOP || (e.Nav_Department.PARENT_ID.HasValue && e.Nav_Department.PARENT_ID == DEPARTMENT_ID_WORKSHOP), pageFilter, new string[] { "Nav_Department" });
                //        result.Data = orderPageEntities.Data;
                //        result.TotalCount = orderPageEntities.TotalCount;
                //    });
                //}
                //else
                //{
                //    return WitOrderPaged(e => e.ENABLE_STATUS == 0 && e.CODE != "admin", pageFilter);
                //} 
                #endregion
            }
            else
            {
                return WitOrderPaged(t => t.Nav_BelongRoles.Any(i => i.Nav_BelongRole.NAME.Contains(pageFilter.Parameter1)), pageFilter);
            }
        }
        /// 
        /// 递归获取部门以及子部门的所有用户
        /// 
        /// 
        /// 
        [HttpPost, Route("GetDepUsersRecursion")]
        public JsonActionResult> GetDepUsersRecursion([FromBody] KeywordFilter filter)
        {
            return SafeExecute>(() =>
            {
                var baseFilter = new BaseFilter(filter.GetOrgId());
                baseFilter.SelectField = new string[] { "ID", "PARENT_ID" };
                var departments = this.GetEntities(i => i.ENABLE_STATUS == (int)FMEnableStatusEnum.启用, baseFilter);
                var selectDepatmentIds = new List();
                if (!string.IsNullOrEmpty(filter.Keyword))
                {
                    var parentid = Guid.Parse(filter.Keyword);
                    GetRecursionDepIds(departments, selectDepatmentIds, parentid);
                    return this.GetEntities(i => selectDepatmentIds.Contains(i.DEPARTMENT_ID.Value), filter);
                }
                else
                {
                    return this.GetEntities(null, filter);
                }
            });
        }
        private static void GetRecursionDepIds(IEnumerable departments, List selectDepatmentIds, Guid parentid)
        {
            selectDepatmentIds.Add(parentid);
            if (departments.Any(i => i.PARENT_ID == parentid))
            {
                var childIds = departments.Where(i => i.PARENT_ID == parentid).Select(i => i.ID);
                foreach (var childId in childIds)
                {
                    GetRecursionDepIds(departments, selectDepatmentIds, childId);
                }
            }
        }
    }
}