using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;

namespace NPP.SmartSchedue.Api.Contracts.Services.Integration.Input;

/// <summary>
/// 发布整合记录输入参数
/// 包含发布操作的所有必要信息和业务规则验证参数
/// 
/// 业务思考：
/// 1. 发布是整合记录生命周期的关键节点，需要严格的权限验证
/// 2. 发布后任务状态将从PendingIntegration更新为Assigned，这是不可逆操作
/// 3. 支持发布备注，记录发布的业务背景和特殊说明
/// 4. 包含强制发布选项，应对特殊业务场景但需要额外权限
/// </summary>
public class PublishIntegrationRecordInput
{
    /// <summary>
    /// 整合记录ID
    /// </summary>
    [Required(ErrorMessage = "整合记录ID不能为空")]
    [Range(1, long.MaxValue, ErrorMessage = "整合记录ID必须大于0")]
    public long IntegrationRecordId { get; set; }

    /// <summary>
    /// 发布操作员用户ID
    /// </summary>
    [Required(ErrorMessage = "发布操作员用户ID不能为空")]
    [Range(1, long.MaxValue, ErrorMessage = "发布操作员用户ID必须大于0")]
    public long PublishedByUserId { get; set; }

    /// <summary>
    /// 发布操作员用户名
    /// </summary>
    [Required(ErrorMessage = "发布操作员用户名不能为空")]
    [StringLength(50, ErrorMessage = "发布操作员用户名长度不能超过50个字符")]
    public string PublishedByUserName { get; set; } = string.Empty;

    /// <summary>
    /// 发布操作员真实姓名
    /// </summary>
    [Required(ErrorMessage = "发布操作员真实姓名不能为空")]
    [StringLength(50, ErrorMessage = "发布操作员真实姓名长度不能超过50个字符")]
    public string PublishedByRealName { get; set; } = string.Empty;

    /// <summary>
    /// 发布说明
    /// 记录发布的业务背景、特殊情况或注意事项
    /// </summary>
    [StringLength(500, ErrorMessage = "发布说明长度不能超过500个字符")]
    public string PublishRemarks { get; set; } = string.Empty;

    /// <summary>
    /// 是否跳过发布前验证
    /// 默认false，true时需要额外权限验证
    /// 
    /// 业务意义：
    /// - 正常情况应该为false，进行完整的发布前验证
    /// - 紧急情况下可以设为true，但需要管理员权限
    /// - 跳过验证的发布需要记录审计日志
    /// </summary>
    public bool SkipPrePublishValidation { get; set; } = false;

    /// <summary>
    /// 是否强制发布
    /// 当发现潜在冲突但仍需要发布时使用，需要特殊权限
    /// 
    /// 业务场景：
    /// - 临时调整导致的轻微冲突但业务必须继续
    /// - 系统维护期间的特殊发布需求
    /// - 应急处理场景下的破例发布
    /// </summary>
    public bool ForcePublish { get; set; } = false;

    /// <summary>
    /// 预期发布生效时间
    /// null表示立即生效，否则按指定时间生效
    /// 
    /// 业务考虑：
    /// - 支持定时发布功能，便于计划性任务安排
    /// - 立即发布适用于紧急任务调度
    /// - 定时发布可以配合班次计划进行优化
    /// </summary>
    public DateTime? ScheduledPublishTime { get; set; }

    /// <summary>
    /// 发布后是否自动开始任务
    /// 控制发布后是否将任务状态进一步更新为InProgress
    /// 
    /// 业务逻辑：
    /// - true：发布后任务自动开始执行（PendingIntegration -> Assigned -> InProgress）
    /// - false：发布后任务处于已分配状态，等待手动开始（PendingIntegration -> Assigned）
    /// </summary>
    public bool AutoStartTasksAfterPublish { get; set; } = false;

    /// <summary>
    /// 通知相关人员
    /// 发布后是否通知相关的人员和设备管理员
    /// </summary>
    public bool NotifyRelatedPersonnel { get; set; } = true;

    /// <summary>
    /// 发布范围限制
    /// 指定只发布特定任务，null表示发布整合记录中的所有任务
    /// 
    /// 业务价值：
    /// - 支持部分发布功能，提高发布的灵活性
    /// - 当某些任务出现问题时，可以单独发布其他正常任务
    /// - 便于分阶段发布和风险控制
    /// </summary>
    public List<long>? SpecificTaskIds { get; set; }
}