using ce.autofac.extension;
using learun.iapplication;
using learun.util;
using Newtonsoft.Json.Linq;
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 CompanyBLL : CompanyIBLL, BLL
	{
		#region 属性

		private readonly CompanyService companyService = new CompanyService();
		private readonly UserIBLL _userIBLL;

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

		#endregion 属性

		#region 获取数据

		/// <summary>
		/// 获取公司列表数据
		/// </summary>
		/// <param name="keyWord">查询关键字</param>
		/// <returns></returns>
		public Task<IEnumerable<CompanyEntity>> GetList(string keyWord = "")
		{
			return companyService.GetList(keyWord);
		}

		/// <summary>
		/// 获取子公司列表信息
		/// </summary>
		/// <param name="pId">父级Id</param>
		/// <returns></returns>
		public Task<IEnumerable<CompanyEntity>> GetListByPId(string pId)
		{
			return companyService.GetListByPId(pId);
		}

		/// <summary>
		/// 获取公司信息实体
		/// </summary>
		/// <param name="keyValue">主键</param>
		/// <returns></returns>
		public Task<CompanyEntity> GetEntity(string keyValue)
		{
			return companyService.GetEntity(keyValue);
		}

		/// <summary>
		/// 获取树形数据
		/// </summary>
		/// <param name="parentId">父级id</param>
		/// <returns></returns>
		public async Task<IEnumerable<TreeModel>> GetTree(string parentId)
		{
			List<CompanyEntity> list = (List<CompanyEntity>)await GetList();
			List<TreeModel> treeList = new List<TreeModel>();
			foreach (var item in list)
			{
				TreeModel node = new TreeModel
				{
					id = item.F_CompanyId,
					text = item.F_FullName,
					value = item.F_CompanyId,
					showcheck = false,
					checkstate = 0,
					isexpand = true,
					parentId = item.F_ParentId
				};
				treeList.Add(node);
			}

			return treeList.ToTree(parentId);
		}

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

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

		#endregion 获取数据

		#region 2

		/// <summary>
		/// 获取公司列表数据
		/// </summary>
		/// <param name="queryParam">查询关键字</param>
		/// <returns></returns>
		public Task<IEnumerable<CompanyEntity>> GetList2(JObject queryParam)
		{
			return companyService.GetList2(queryParam);
		}

		/// <summary>
		/// 获取子公司列表信息
		/// </summary>
		/// <param name="companyId">父级Id</param>
		/// <returns></returns>
		public Task<IEnumerable<CompanyEntity>> GetChildList(string companyId)
		{
			return companyService.GetChildList(companyId);
		}

		/// <summary>
		/// 获取树形数据
		/// </summary>
		/// <param name="companyId">父级id</param>
		/// <returns></returns>
		public async Task<IEnumerable<TreeModel>> GetTree2(string companyId)
		{
			var list = (List<CompanyEntity>)await GetChildList(companyId);
			var treeList = new List<TreeModel>();

			foreach (var item in list)
			{
				TreeModel node = new TreeModel
				{
					id = item.F_CompanyId,
					text = item.F_FullName,
					value = item.F_CompanyId,
					showcheck = false,
					checkstate = 0,
					isexpand = true,
					parentId = item.F_ParentId
				};
				treeList.Add(node);
			}
			return treeList.ToTree(companyId);
		}

		#endregion 2

		#region 提交数据

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

		/// <summary>
		/// 保存公司信息(新增、修改)
		/// </summary>
		/// <param name="keyValue">主键值</param>
		/// <param name="entity">公司实体</param>
		/// <returns></returns>
		public async Task SaveEntity(string keyValue, CompanyEntity entity)
		{
			await companyService.SaveEntity(keyValue, entity);
		}

		#endregion 提交数据
	}
}