using System;
using System.Collections.Generic;

namespace NPP.SmartSchedue.Api.Contracts.Services.Equipment.Dto;

/// <summary>
/// 设备类型使用率统计输出模型
/// 深度业务场景：支持设备使用效率分析和产能评估
/// </summary>
public class EquipmentTypeUsageOutput
{
    /// <summary>
    /// 设备类型
    /// </summary>
    public string EquipmentType { get; set; } = string.Empty;

    /// <summary>
    /// 设备类型显示名称
    /// </summary>
    public string EquipmentTypeName { get; set; } = string.Empty;

    /// <summary>
    /// 统计时间段
    /// </summary>
    public DateTime StatisticsPeriodStart { get; set; }
    public DateTime StatisticsPeriodEnd { get; set; }

    /// <summary>
    /// 平均使用率（百分比）
    /// 业务深度思考：基于实际工作时间与理论可用时间的比值
    /// </summary>
    public decimal AverageUtilizationRate { get; set; }

    /// <summary>
    /// 峰值使用率（百分比）
    /// </summary>
    public decimal PeakUtilizationRate { get; set; }

    /// <summary>
    /// 最低使用率（百分比）
    /// </summary>
    public decimal MinUtilizationRate { get; set; }

    /// <summary>
    /// 总工作时长（小时）
    /// </summary>
    public decimal TotalWorkingHours { get; set; }

    /// <summary>
    /// 理论可用时长（小时）
    /// 深度业务逻辑：考虑设备维护、停机时间后的实际可用时间
    /// </summary>
    public decimal TotalAvailableHours { get; set; }

    /// <summary>
    /// 设备空闲时长（小时）
    /// </summary>
    public decimal TotalIdleHours { get; set; }

    /// <summary>
    /// 维护停机时长（小时）
    /// </summary>
    public decimal MaintenanceDowntimeHours { get; set; }

    /// <summary>
    /// 故障停机时长（小时）
    /// </summary>
    public decimal FaultDowntimeHours { get; set; }

    /// <summary>
    /// 使用率趋势分析
    /// 深度业务场景：支持设备负荷预测和产能规划
    /// </summary>
    public UsageTrendAnalysis TrendAnalysis { get; set; } = new();

    /// <summary>
    /// 按班次的使用率分布
    /// </summary>
    public List<ShiftUsageDistribution> ShiftUsageDistribution { get; set; } = new();

    /// <summary>
    /// 设备使用效率评级
    /// 业务深度思考：基于使用率、故障率、维护频次的综合评估
    /// </summary>
    public EquipmentEfficiencyRating EfficiencyRating { get; set; } = new();
}

/// <summary>
/// 使用率趋势分析
/// 深度业务逻辑：基于历史数据分析未来使用趋势
/// </summary>
public class UsageTrendAnalysis
{
    /// <summary>
    /// 使用率变化趋势（相比上期百分比变化）
    /// </summary>
    public decimal UsageRateChange { get; set; }

    /// <summary>
    /// 趋势方向（Increasing, Decreasing, Stable）
    /// </summary>
    public string TrendDirection { get; set; } = "Stable";

    /// <summary>
    /// 预测下期使用率
    /// </summary>
    public decimal PredictedUsageRate { get; set; }

    /// <summary>
    /// 趋势置信度（0-100）
    /// </summary>
    public decimal TrendConfidence { get; set; }
}

/// <summary>
/// 班次使用率分布
/// 业务深度思考：支持班次安排优化和人员调度决策
/// </summary>
public class ShiftUsageDistribution
{
    /// <summary>
    /// 班次名称
    /// </summary>
    public string ShiftName { get; set; } = string.Empty;

    /// <summary>
    /// 班次开始时间
    /// </summary>
    public TimeSpan ShiftStartTime { get; set; }

    /// <summary>
    /// 班次结束时间
    /// </summary>
    public TimeSpan ShiftEndTime { get; set; }

    /// <summary>
    /// 该班次的平均使用率
    /// </summary>
    public decimal AverageUsageRate { get; set; }

    /// <summary>
    /// 该班次的工作天数
    /// </summary>
    public int WorkingDays { get; set; }

    /// <summary>
    /// 该班次的总工作小时数
    /// </summary>
    public decimal TotalWorkingHours { get; set; }
}

/// <summary>
/// 设备使用效率评级
/// 深度业务场景：支持设备性能评估和改进建议
/// </summary>
public class EquipmentEfficiencyRating
{
    /// <summary>
    /// 综合效率得分（0-100分）
    /// 计算逻辑：使用率权重40% + 可用率权重30% + 质量指标权重30%
    /// </summary>
    public decimal OverallScore { get; set; }

    /// <summary>
    /// 效率等级（Excellent, Good, Average, Poor）
    /// </summary>
    public string EfficiencyGrade { get; set; } = "Average";

    /// <summary>
    /// 使用率得分（0-100）
    /// </summary>
    public decimal UtilizationScore { get; set; }

    /// <summary>
    /// 可用率得分（0-100）
    /// 深度业务逻辑：考虑计划内维护和非计划停机的影响
    /// </summary>
    public decimal AvailabilityScore { get; set; }

    /// <summary>
    /// 质量指标得分（0-100）
    /// 基于故障频次、维护成本等指标
    /// </summary>
    public decimal QualityScore { get; set; }

    /// <summary>
    /// 改进建议列表
    /// </summary>
    public List<string> ImprovementSuggestions { get; set; } = new();
}