using System.Collections.Generic;

namespace SHH.ProcessLaunchers
{
    /// <summary>
    /// 进程启动配置项
    /// </summary>
    public class ProcessConfig
    {
        #region --- 身份标识 (Identity) ---

        // <summary>
        /// [核心变更] 唯一标识符 (Key)
        /// <para>用于管理器内部索引，不可重复。例如: "Streamer_01", "Streamer_02"</para>
        /// </summary>
        public string Id { get; set; } = string.Empty;

        /// <summary>
        /// [核心变更] 通用显示名称 (Category/Type)
        /// <para>描述这是一类什么程序。例如: "VideoStreamingService"</para>
        /// <para>多个实例可以拥有相同的 DisplayName。</para>
        /// </summary>
        public string DisplayName { get; set; } = string.Empty;

        /// <summary>
        /// 描述备注 (可选)
        /// <para>例如: "负责处理 192.168.1.10 的视频流"</para>
        /// </summary>
        public string Description { get; set; } = string.Empty;

        #endregion

        #region --- 启动参数 (Launch Args) ---

        /// <summary>可执行文件路径 (绝对路径或相对路径)</summary>
        public string ExePath { get; set; } = string.Empty;

        /// <summary>启动参数字符串 (例如 "--id=1 --debug")</summary>
        public string Arguments { get; set; } = string.Empty;

        /// <summary>工作目录 (默认为 Exe 所在目录)</summary>
        public string WorkingDirectory { get; set; } = string.Empty;

        #endregion

        #region --- 表现层配置 ---

        /// <summary>
        /// 是否显示程序窗口
        /// <para>True: 弹出控制台窗口或UI | False: 后台静默运行 (CreateNoWindow=true)</para>
        /// </summary>
        public bool Visible { get; set; } = false;

        /// <summary>
        /// 是否接管标准输出/错误流 (RedirectStandardOutput)
        /// <para>True: 启动器将捕获 Console.WriteLine 内容并通过日志接口转发。</para>
        /// <para>注意: 如果 Visible=true，建议设为 false，否则控制台窗口将是黑屏。</para>
        /// </summary>
        public bool EnableLogRedirect { get; set; } = true;

        #endregion

        #region --- 守护策略配置 ---

        /// <summary>意外退出后的常规重启延迟 (毫秒)，默认 3000ms</summary>
        public int RestartDelayMs { get; set; } = 3000;

        /// <summary>连续失败阈值 (达到此次数后触发熔断)，默认 3 次</summary>
        public int MaxConsecutiveFailures { get; set; } = 3;

        /// <summary>熔断冷却时长 (毫秒)，默认 30分钟 (1800000ms)</summary>
        public int CircuitBreakerDelayMs { get; set; } = 30 * 60 * 1000;

        /// <summary>
        /// 稳定运行判定阈值 (毫秒)
        /// <para>如果进程存活时间超过此值，则视为启动成功，重置失败计数器。</para>
        /// </summary>
        public int StabilityThresholdMs { get; set; } = 60 * 1000;

        /// <summary>
        /// 自动重启间隔 (分钟)。0 表示不启用定时重启。
        /// <para>用于防止内存碎片或长期运行的不稳定性。</para>
        /// </summary>
        public int AutoRestartIntervalMinutes { get; set; } = 0;

        #endregion

        #region --- 排序启动 ---

        /// <summary>
        /// [新增] 启动顺序权重
        /// <para>数字越小越先启动 (0, 1, 2...)</para>
        /// </summary>
        public int StartupOrder { get; set; } = 0;

        /// <summary>
        /// [新增] 启动后等待时长 (毫秒)
        /// <para>当前进程启动后，等待多久再启动下一个进程。用于防止瞬间 CPU 峰值或依赖等待。</para>
        /// </summary>
        public int PostStartupDelayMs { get; set; } = 3000;

        #endregion

        /// <summary>资源哨兵列表 (内存监控、心跳监控等)</summary>
        public List<IResourceGuard> Guards { get; set; } = new List<IResourceGuard>();
    }
}