using ce.autofac.extension;
using learun.iapplication;
using learun.util;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace learun.application
{
	/// <summary>
	/// 版 本 EasyCode EC管理后台
	/// Copyright (c) 2019-present EC管理有限公司
	/// 创建人:tobin
	/// 日 期:2019.09.24
	/// 描 述:部门管理
	/// </summary>
	public class DepartmentBLL : DepartmentIBLL, BLL
	{
		#region 属性

		private readonly DepartmentService departmentService = new DepartmentService();
		private readonly UserIBLL _userIBLL;

		/// <summary>
		///
		/// </summary>
		/// <param name="userIBLL"></param>
		public DepartmentBLL(UserIBLL userIBLL)
		{
			_userIBLL = userIBLL;
		}

		#endregion 属性

		#region 获取数据

		/// <summary>
		/// 获取部门列表信息(根据公司Id)
		/// </summary>
		/// <param name="companyId">公司Id</param>
		/// <returns></returns>
		public Task<IEnumerable<DepartmentEntity>> GetList(string companyId)
		{
			return departmentService.GetList(companyId);
		}

		/// <summary>
		/// 获取部门列表信息(根据公司Id)
		/// </summary>
		/// <param name="companyId">公司Id</param>
		/// <param name="keyWord">查询关键字</param>
		/// <returns></returns>
		public async Task<IEnumerable<DepartmentEntity>> GetList(string companyId, string keyWord)
		{
			List<DepartmentEntity> list = (List<DepartmentEntity>)await GetList(companyId);
			if (!string.IsNullOrEmpty(keyWord))
			{
				list = list.FindAll(t => t.F_FullName.Contains(keyWord) || t.F_EnCode.Contains(keyWord) || t.F_ShortName.Contains(keyWord));
			}
			return list;
		}

		/// <summary>
		/// 获取部门列表信息(根据公司Id 和 父级 id)
		/// </summary>
		/// <param name="companyId">公司主键</param>
		/// <param name="pid">父级 id</param>
		/// <returns></returns>
		public Task<IEnumerable<DepartmentEntity>> GetListByPid(string companyId, string pid)
		{
			return departmentService.GetListByPid(companyId, pid);
		}

		/// <summary>
		/// 获取部门列表信息
		/// </summary>
		/// <param name="keyWord">关键字</param>
		/// <returns></returns>
		public Task<IEnumerable<DepartmentEntity>> GetAllList(string keyWord)
		{
			return departmentService.GetAllList(keyWord);
		}

		/// <summary>
		/// 获取部门列表信息(根据部门ID集合)
		/// </summary>
		/// <param name="keyValues">部门ID集合</param>
		/// <returns></returns>
		public Task<IEnumerable<DepartmentEntity>> GetListByKeys(List<string> keyValues)
		{
			return departmentService.GetListByKeys(keyValues);
		}

		/// <summary>
		/// 获取部门数据实体
		/// </summary>
		/// <param name="keyValue">主键</param>
		/// <returns></returns>
		public Task<DepartmentEntity> GetEntity(string keyValue)
		{
			return departmentService.GetEntity(keyValue);
		}

		/// <summary>
		/// 获取树形数据
		/// </summary>
		/// <param name="companyId">公司id</param>
		/// <param name="parentId">父级id</param>
		/// <returns></returns>
		public async Task<IEnumerable<TreeModel>> GetTree(string companyId, string parentId)
		{
			if (string.IsNullOrEmpty(companyId))
			{// 如果公司主键没有的话,需要加载公司信息
				return new List<TreeModel>();
			}

			List<DepartmentEntity> list = (List<DepartmentEntity>)await GetList(companyId);
			List<TreeModel> treeList = new List<TreeModel>();
			foreach (var item in list)
			{
				TreeModel node = new TreeModel
				{
					id = item.F_DepartmentId,
					text = item.F_FullName,
					value = item.F_DepartmentId,
					showcheck = false,
					checkstate = 0,
					isexpand = true,
					parentId = item.F_ParentId,
					exid1 = item.F_EnCode,
					exid2 = "d"
				};

				treeList.Add(node);
			}
			return treeList.ToTree(parentId);
		}

		/// <summary>
		/// 获取树形数据
		/// </summary>
		/// <param name="companylist">公司数据列表</param>
		/// <returns></returns>
		public async Task<IEnumerable<TreeModel>> GetTree(IEnumerable<CompanyEntity> companylist)
		{
			List<TreeModel> treeList = new List<TreeModel>();
			foreach (var companyone in companylist)
			{
				List<TreeModel> departmentTree = (List<TreeModel>)await GetTree(companyone.F_CompanyId, "");
				if (departmentTree.Count > 0)
				{
					TreeModel node = new TreeModel
					{
						id = companyone.F_CompanyId,
						text = companyone.F_FullName,
						value = companyone.F_CompanyId,
						showcheck = false,
						checkstate = 0,
						isexpand = true,
						parentId = "0",
						hasChildren = true,
						ChildNodes = departmentTree,
						complete = true,
						exid1 = companyone.F_EnCode,
						exid2 = "c"
					};
					treeList.Add(node);
				}
			}
			return treeList;
		}

		/// <summary>
		/// 获取部门本身和子部门的id
		/// </summary>
		/// <param name="companyId">公司主键</param>
		/// <param name="parentId">父级ID</param>
		/// <returns></returns>
		public async Task<IEnumerable<string>> GetSubNodes(string companyId, string parentId)
		{
			if (string.IsNullOrEmpty(parentId) || string.IsNullOrEmpty(companyId))
			{
				return new List<string>();
			}
			List<string> res = new List<string>();
			res.Add(parentId);
			List<TreeModel> list = (List<TreeModel>)await GetTree(companyId, parentId);
			GetSubNodes(list, res);
			return res;
		}

		/// <summary>
		/// 遍历树形数据获取全部子节点ID
		/// </summary>
		/// <param name="list">树形数据列表</param>
		/// <param name="ourList">输出数据列表</param>
		private void GetSubNodes(List<TreeModel> list, List<string> ourList)
		{
			foreach (var item in list)
			{
				ourList.Add(item.id);
				if (item.hasChildren)
				{
					GetSubNodes(item.ChildNodes, ourList);
				}
			}
		}

		#endregion 获取数据

		#region 提交数据

		/// <summary>
		/// 删除部门信息
		/// </summary>
		/// <param name="keyValue">主键</param>
		public async Task Delete(string keyValue)
		{
			await departmentService.Delete(keyValue);
		}

		/// <summary>
		/// 保存部门信息(新增、修改)
		/// </summary>
		/// <param name="keyValue">主键值</param>
		/// <param name="departmentEntity">部门实体</param>
		/// <returns></returns>
		public async Task SaveEntity(string keyValue, DepartmentEntity departmentEntity)
		{
			await departmentService.SaveEntity(keyValue, departmentEntity);
		}

		#endregion 提交数据
	}
}