using System;
using System.Collections.Generic;

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

/// <summary>
/// 设备类型任务分配统计输出模型
/// 深度业务场景：支持工艺流程分析、设备负荷均衡评估和生产计划优化
/// </summary>
public class EquipmentTypeTaskAllocationOutput
{
    /// <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 TaskAllocationSummary AllocationSummary { get; set; } = new();

    /// <summary>
    /// 按优先级分组的任务分配统计
    /// 业务深度逻辑：支持紧急任务和常规任务的资源分配决策
    /// </summary>
    public List<TaskPriorityAllocation> PriorityAllocations { get; set; } = new();

    /// <summary>
    /// 按工序类型分组的任务分配统计
    /// 深度业务场景：分析该设备类型在不同工序中的使用情况
    /// </summary>
    public List<ProcessTypeAllocation> ProcessAllocations { get; set; } = new();

    /// <summary>
    /// 按时间段的任务分配分布
    /// 支持24小时工作负荷分析和班次安排优化
    /// </summary>
    public List<TimeSlotAllocation> TimeSlotAllocations { get; set; } = new();

    /// <summary>
    /// 设备负荷均衡分析
    /// 深度业务思考：评估设备间的工作负荷分布是否合理
    /// </summary>
    public LoadBalanceAnalysis LoadBalanceAnalysis { get; set; } = new();

    /// <summary>
    /// 任务完成质量指标
    /// 业务深度场景：评估该设备类型在任务执行中的表现
    /// </summary>
    public TaskCompletionQuality CompletionQuality { get; set; } = new();
}

/// <summary>
/// 任务分配汇总统计
/// </summary>
public class TaskAllocationSummary
{
    /// <summary>
    /// 总任务数量
    /// </summary>
    public int TotalTaskCount { get; set; }

    /// <summary>
    /// 已完成任务数量
    /// </summary>
    public int CompletedTaskCount { get; set; }

    /// <summary>
    /// 进行中任务数量
    /// </summary>
    public int InProgressTaskCount { get; set; }

    /// <summary>
    /// 待分配任务数量
    /// </summary>
    public int PendingTaskCount { get; set; }

    /// <summary>
    /// 已取消任务数量
    /// </summary>
    public int CancelledTaskCount { get; set; }

    /// <summary>
    /// 总预估工时（小时）
    /// </summary>
    public decimal TotalEstimatedHours { get; set; }

    /// <summary>
    /// 总实际工时（小时）
    /// </summary>
    public decimal TotalActualHours { get; set; }

    /// <summary>
    /// 工时准确率（实际工时与预估工时的比值）
    /// 深度业务逻辑：评估工时预估的准确性，支持后续预估优化
    /// </summary>
    public decimal TimeAccuracyRate => TotalEstimatedHours > 0 ? 
        TotalActualHours / TotalEstimatedHours * 100 : 0;

    /// <summary>
    /// 任务完成率（百分比）
    /// </summary>
    public decimal CompletionRate => TotalTaskCount > 0 ? 
        (decimal)CompletedTaskCount / TotalTaskCount * 100 : 0;
}

/// <summary>
/// 按优先级的任务分配统计
/// 深度业务思考：分析不同优先级任务的分配和完成情况
/// </summary>
public class TaskPriorityAllocation
{
    /// <summary>
    /// 优先级等级
    /// </summary>
    public int PriorityLevel { get; set; }

    /// <summary>
    /// 优先级名称（紧急、高、中、低）
    /// </summary>
    public string PriorityName { get; set; } = string.Empty;

    /// <summary>
    /// 该优先级任务数量
    /// </summary>
    public int TaskCount { get; set; }

    /// <summary>
    /// 该优先级任务占比（百分比）
    /// </summary>
    public decimal TaskPercentage { get; set; }

    /// <summary>
    /// 平均完成时间（小时）
    /// </summary>
    public decimal AverageCompletionTime { get; set; }

    /// <summary>
    /// 按时完成率（百分比）
    /// 深度业务指标：评估高优先级任务的及时完成情况
    /// </summary>
    public decimal OnTimeCompletionRate { get; set; }
}

/// <summary>
/// 按工序类型的任务分配统计
/// </summary>
public class ProcessTypeAllocation
{
    /// <summary>
    /// 工序类型
    /// </summary>
    public string ProcessType { get; set; } = string.Empty;

    /// <summary>
    /// 工序名称
    /// </summary>
    public string ProcessName { get; set; } = string.Empty;

    /// <summary>
    /// 该工序类型的任务数量
    /// </summary>
    public int TaskCount { get; set; }

    /// <summary>
    /// 该工序类型任务占比
    /// </summary>
    public decimal TaskPercentage { get; set; }

    /// <summary>
    /// 该工序的平均耗时（小时）
    /// </summary>
    public decimal AverageDuration { get; set; }

    /// <summary>
    /// 该工序的标准耗时（小时）
    /// </summary>
    public decimal StandardDuration { get; set; }

    /// <summary>
    /// 工序效率指标（实际耗时与标准耗时的比值）
    /// 深度业务分析：评估工序执行效率，识别改进机会
    /// </summary>
    public decimal EfficiencyRatio => StandardDuration > 0 ? 
        StandardDuration / AverageDuration * 100 : 0;
}

/// <summary>
/// 时间段任务分配分布
/// 深度业务场景：支持24小时生产排程和班次优化决策
/// </summary>
public class TimeSlotAllocation
{
    /// <summary>
    /// 时间段（小时，0-23）
    /// </summary>
    public int TimeSlot { get; set; }

    /// <summary>
    /// 该时间段的任务数量
    /// </summary>
    public int TaskCount { get; set; }

    /// <summary>
    /// 该时间段的设备使用率
    /// </summary>
    public decimal UtilizationRate { get; set; }

    /// <summary>
    /// 该时间段的平均任务持续时间
    /// </summary>
    public decimal AverageTaskDuration { get; set; }

    /// <summary>
    /// 该时间段对应的班次信息
    /// </summary>
    public string ShiftName { get; set; } = string.Empty;
}

/// <summary>
/// 负荷均衡分析
/// 深度业务思考：评估设备类型内各设备间的工作分配是否均衡
/// </summary>
public class LoadBalanceAnalysis
{
    /// <summary>
    /// 最高负荷设备的工作量
    /// </summary>
    public decimal MaxWorkload { get; set; }

    /// <summary>
    /// 最低负荷设备的工作量
    /// </summary>
    public decimal MinWorkload { get; set; }

    /// <summary>
    /// 平均工作量
    /// </summary>
    public decimal AverageWorkload { get; set; }

    /// <summary>
    /// 负荷均衡系数（0-1，越接近1越均衡）
    /// 计算逻辑：1 - (最大工作量 - 最小工作量) / 平均工作量
    /// </summary>
    public decimal BalanceCoefficient { get; set; }

    /// <summary>
    /// 工作量标准差
    /// 深度统计分析：衡量设备间工作量分布的离散程度
    /// </summary>
    public decimal WorkloadStandardDeviation { get; set; }

    /// <summary>
    /// 负荷均衡评级（Excellent, Good, Average, Poor）
    /// </summary>
    public string BalanceRating { get; set; } = "Average";

    /// <summary>
    /// 均衡优化建议
    /// </summary>
    public List<string> OptimizationSuggestions { get; set; } = new();
}

/// <summary>
/// 任务完成质量指标
/// 深度业务评估：从多维度评价设备类型的任务执行质量
/// </summary>
public class TaskCompletionQuality
{
    /// <summary>
    /// 准时完成率（百分比）
    /// </summary>
    public decimal OnTimeCompletionRate { get; set; }

    /// <summary>
    /// 质量合格率（百分比）
    /// </summary>
    public decimal QualityPassRate { get; set; }

    /// <summary>
    /// 返工率（百分比）
    /// </summary>
    public decimal ReworkRate { get; set; }

    /// <summary>
    /// 平均延期天数
    /// </summary>
    public decimal AverageDelayDays { get; set; }

    /// <summary>
    /// 客户满意度评分（1-5分）
    /// </summary>
    public decimal CustomerSatisfactionScore { get; set; }

    /// <summary>
    /// 综合质量得分（0-100分）
    /// 深度业务算法：综合考虑准时性、质量、客户满意度等因素
    /// </summary>
    public decimal OverallQualityScore { get; set; }

    /// <summary>
    /// 质量等级（Excellent, Good, Average, Poor）
    /// </summary>
    public string QualityGrade { get; set; } = "Average";

    /// <summary>
    /// 质量改进建议
    /// </summary>
    public List<string> ImprovementRecommendations { get; set; } = new();
}