using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using NPP.SmartSchedue.Api.Contracts.Services.Integration.Output;

namespace NPP.SmartSchedue.Api.Contracts.Services.Integration
{
    /// <summary>
    /// 设备服务客户端接口
    /// 用于调度模块与EAM设备管理模块之间的通信
    /// 避免直接依赖EAM模块的服务接口，实现模块解耦
    /// </summary>
    public interface IEquipmentClientService
    {
        /// <summary>
        /// 获取指定日期的可用设备列表
        /// 用于任务整合前的资源充足性检查
        /// </summary>
        /// <param name="date">指定日期</param>
        /// <param name="processId">工序ID（可选，用于筛选特定工序的设备）</param>
        /// <returns>可用设备列表</returns>
        Task<List<EquipmentBasicInfo>> GetAvailableEquipmentAsync(DateTime date, long? processId = null);

        /// <summary>
        /// 检查指定设备在指定日期是否可用
        /// 用于验证特定设备的可用性状态
        /// </summary>
        /// <param name="equipmentId">设备ID</param>
        /// <param name="date">指定日期</param>
        /// <returns>是否可用</returns>
        Task<bool> IsEquipmentAvailableAsync(long equipmentId, DateTime date);

        /// <summary>
        /// 获取指定日期范围内的设备使用统计
        /// 用于资源容量计算和负荷分析
        /// </summary>
        /// <param name="startDate">开始日期</param>
        /// <param name="endDate">结束日期</param>
        /// <returns>设备使用统计信息</returns>
        Task<EquipmentUsageStatistics> GetEquipmentUsageStatisticsAsync(DateTime startDate, DateTime endDate);

        /// <summary>
        /// 获取指定日期需要维护的设备列表
        /// 用于计算维护中不可用的设备数量
        /// </summary>
        /// <param name="date">指定日期</param>
        /// <returns>需要维护的设备列表</returns>
        Task<List<EquipmentBasicInfo>> GetMaintenanceEquipmentAsync(DateTime date);

        /// <summary>
        /// 获取指定日期需要校验的设备列表
        /// 用于计算校验中不可用的设备数量
        /// </summary>
        /// <param name="date">指定日期</param>
        /// <returns>需要校验的设备列表</returns>
        Task<List<EquipmentBasicInfo>> GetCalibrationEquipmentAsync(DateTime date);

        /// <summary>
        /// 批量检查设备可用性
        /// 用于大批量任务的设备资源验证，提高查询效率
        /// </summary>
        /// <param name="equipmentIds">设备ID列表</param>
        /// <param name="date">指定日期</param>
        /// <returns>设备可用性状态字典，Key为设备ID，Value为是否可用</returns>
        Task<Dictionary<long, bool>> BatchCheckEquipmentAvailabilityAsync(List<long> equipmentIds, DateTime date);
    }
}