using System.Threading.Tasks;
using System.Collections.Generic;
using NPP.SmartSchedue.Api.Contracts.Domain.Personnel;
using ZhonTai.Admin.Core.Dto;
using NPP.SmartSchedue.Api.Contracts.Services.Personnel.Input;
using NPP.SmartSchedue.Api.Contracts.Services.Personnel.Output;
using System;

namespace NPP.SmartSchedue.Api.Contracts.Services.Personnel;

/// <summary>
/// 人员资质绑定服务接口
/// </summary>
public interface IPersonnelQualificationService
{
    Task<PersonnelQualificationGetOutput> GetAsync(long id);

    Task<PageOutput<PersonnelQualificationGetPageOutput>> GetPageAsync(PageInput<PersonnelQualificationGetPageInput> input);

    Task<long> AddAsync(PersonnelQualificationAddInput input);

    Task UpdateAsync(PersonnelQualificationUpdateInput input);

    Task DeleteAsync(long id);

    Task SoftDeleteAsync(long id);

    Task BatchSoftDeleteAsync(long[] ids);

    /// <summary>
    /// 根据资质ID列表获取具有这些资质的人员基础信息列表（ID + 姓名）
    /// </summary>
    /// <param name="qualificationIds">资质ID列表</param>
    /// <returns></returns>
    Task<List<PersonnelBasicInfo>> GetPersonnelIdsByQualificationIdsAsync(long[] qualificationIds);

    /// <summary>
    /// 根据资质ID字符串（逗号分隔）获取具有这些资质的人员基础信息列表（ID + 姓名）
    /// </summary>
    /// <param name="qualificationIds">资质ID字符串，使用逗号分隔</param>
    /// <returns></returns>
    Task<List<PersonnelBasicInfo>> GetPersonnelIdsByQualificationIdsAsync(string qualificationIds);

    /// <summary>
    /// 根据人员ID获取其所有有效资质信息
    /// </summary>
    /// <param name="personnelId">人员ID</param>
    /// <returns></returns>
    Task<List<PersonnelQualificationGetPageOutput>> GetActiveQualificationsByPersonnelIdAsync(long personnelId);

    /// <summary>
    /// 获取所有有资质记录的人员列表（用于人员池构建）
    /// 深度业务思考：从资质表获取所有关联人员，确保智能分配系统的人员池完整性
    /// </summary>
    /// <returns>所有有资质记录的人员资质信息</returns>
    Task<List<PersonnelQualificationGetPageOutput>> GetAllPersonnelWithQualificationsAsync();

    /// <summary>
    /// 根据人员ID获取其所有资质记录（包括无效的）
    /// </summary>
    /// <param name="personnelId">人员ID</param>
    /// <returns>人员的所有资质记录</returns>
    Task<List<PersonnelQualificationGetPageOutput>> GetByPersonnelIdAsync(long personnelId);

    /// <summary>
    /// 根据人员ID获取其所有有效的资质实体列表（用于智能分配系统资质匹配）
    /// 深度业务思考：智能分配系统需要完整的资质实体信息进行精确匹配计算
    /// </summary>
    /// <param name="personnelId">人员ID</param>
    /// <returns>人员有效资质实体列表</returns>
    Task<List<NPP.SmartSchedue.Api.Contracts.Domain.Personnel.PersonnelQualificationEntity>> GetPersonnelQualificationsAsync(long personnelId);

    /// <summary>
    /// 获取人员资质统计信息（横坐标为资质，纵坐标为人员数量）
    /// </summary>
    /// <returns>人员资质统计结果</returns>
    Task<PersonnelQualificationStatisticsResult> GetPersonnelQualificationStatisticsAsync();


    /// <summary>
    /// 获取即将过期的资质列表
    /// </summary>
    /// <param name="today"></param>
    /// <param name="personnelIds"></param>
    /// <param name="includeExpired"></param>
    /// <returns></returns>
    Task<List<ExpiringQualificationItemOutput>> GetExpiringAsync(DateTime today, IList<long> personnelIds = null, bool includeExpired = false);
} 