using System.Collections.Generic;
using System.Threading.Tasks;
using GxPress.Entity;
using GxPress.Request.Department;
using GxPress.Result.Department;
using Datory;

namespace GxPress.Repository.Interface
{
    public interface IDepartmentRepository : IRepository
    {
        Task<bool> ExistsChildrenAsync(int parentId);

        Task<Department> GetAsync(int id);
        Task<Department> GetAsync(string name);

        Task<string> GetNameAsync(int id);

        Task<int> InsertAsync(Department department);

        Task<bool> UpdateAsync(Department department);

        Task<IEnumerable<Department>> GetListAsync(int parentId);

        /// <summary>
        /// 添加
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        Task<Department> AddAsync(Department request);

        /// <summary>
        /// 删除
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        Task<bool> DeleteAsync(int id);

        /// <summary>
        /// 删除
        /// </summary>
        /// <param name="query"></param>
        /// <returns></returns>
        Task<bool> DeleteAsync(SqlKata.Query query);
        /// <summary>
        /// 更新
        /// </summary>
        /// <param name="id"></param>
        /// <param name="request"></param>
        /// <returns></returns>
        Task<bool> UpdateAsync(int id, Department request);

        /// <summary>
        /// 获取树列表
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        Task<List<DepartmentTreeResult>> GetTreeAsync(int id);
        /// <summary>
        /// 根据部门ID获取成员以及下级部门
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        Task<DepartmentUserResult> GetDepartmentUserResultAsync(DepartmentUserRequest request);
        /// <summary>
        /// 根据PID获取所用部门
        /// </summary>
        /// <param name="id"></param>
        /// <param name="departments"></param>
        /// <returns></returns>
        /// <summary>
        /// 获取所用下级部门
        /// </summary>
        /// <param name="id"></param>
        /// <param name="departments"></param>
        /// <returns></returns>
        Task<List<Department>> GetDepartmentById(int id, List<Department> departments);

        Task<string> GetDepartmentFullPathAsync(int departmentId, string departmentName);


        /// <summary>
        /// 获取所用下级部门
        /// </summary>
        /// <param name="id"></param>
        /// <param name="departments"></param>
        /// <returns></returns>
        Task<List<Department>> GetDepartmentByPid(int Pid, List<Department> departments);

        Task<IEnumerable<Department>> GetAllAsync(SqlKata.Query query);
          /// <summary>
        /// 获取树列表
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        Task<List<DepartmentTreeResult>> GetTreeAsync();
    }
}