namespace MiGu.Server.Launcher;

/// <summary>
/// MiGu.Server 启动后由「平台登录」按 LaunchMode 拉起的 SimpleLite 子进程配置。
///
/// 会话 N+1（启动反转）：原架构是 SimpleLite 启动 → 拉 MiGu.Server；现在反过来：
/// MiGu.Server 作为主入口启动 → 登录页选 LaunchMode → 后端拉起 SimpleLite.exe，
/// 通过 <c>--display-mode</c> 参数把 web / web+local 透传给 SimpleLite 的 Configuration。
///
/// 绑定 <c>appsettings.json:SimpleLite</c>。
/// </summary>
public sealed class SimpleLiteOptions
{
    /// <summary>主开关。false = 永不拉起；登录无论选什么 LaunchMode 都不会启动子进程，用于「只跑 Platform 调试」场景。</summary>
    public bool Enabled { get; set; } = true;

    /// <summary>
    /// SimpleLite 可执行文件绝对/相对路径（相对 MiGu.Server 工作目录）。留空则按以下顺序自动探测：
    ///   1) <c>./SimpleLite.exe</c>（合并发布布局：SimpleLite 与 MiGu.Server 同目录）
    ///   2) <c>./SimpleLite/SimpleLite.exe</c>
    ///   3) <c>../SimpleLite.exe</c>（MiGu.Server 部署到子目录的常见布局）
    ///   4) <c>../SimpleLite/bin/Debug/SimpleLite.exe</c>（开发态：Visual Studio 默认输出）
    ///   5) <c>../SimpleLite/bin/Release/SimpleLite.exe</c>
    ///   6) 沿父目录上行寻找 <c>SimpleLite/bin/{Debug|Release}/SimpleLite.exe</c>
    /// </summary>
    public string ExecutablePath { get; set; } = "";

    /// <summary>留空时取 <see cref="ExecutablePath"/> 所在目录。SimpleLite 在 CWD 读写 simple.json / imgui.ini，CWD 选错会出意外。</summary>
    public string WorkingDirectory { get; set; } = "";

    /// <summary>附加命令行参数（拼在 <c>--display-mode=xxx</c> 之后）。常用于本地调试时强制 autoload 某场景。</summary>
    public string Arguments { get; set; } = "";

    /// <summary>
    /// 子进程启动后阻塞等待 Projection (:8222) 端口就绪的最长毫秒数。
    /// 0 = 不等待（登录立即返回，前端可能还连不上 SimpleLite WebApi）；
    /// 负值 = 无限等待（直到子进程退出或就绪）。
    /// </summary>
    public int ReadinessTimeoutMs { get; set; } = 8000;

    /// <summary>每隔多少毫秒 poll 一次 Projection 端口可达性。</summary>
    public int ReadinessPollIntervalMs { get; set; } = 250;

    /// <summary>SimpleLite Projection WebApi 监听端口。默认与 SimpleLite Configuration 的 `port` 一致。用于就绪检测。</summary>
    public int ProjectionPort { get; set; } = 8222;

    /// <summary>
    /// 是否把 SimpleLite 绑定到 MiGu.Server 生命周期，默认 <b>false</b>（会话 N+2 用户反馈）。
    ///
    /// 设计原则：SimpleLite 与 MiGu.Server 是「两个独立程序」，Platform 只是登录后顺手拉起 SimpleLite；
    /// MiGu.Server 关闭不应该带走 SimpleLite，反之亦然。所以 FollowParent 默认 false：
    /// - 子进程走 <c>UseShellExecute=true</c> 创建独立进程组 + 独立控制台窗口；
    /// - 不挂 JobObject，不在 ApplicationStopping / ProcessExit 时 kill 子进程；
    /// - SimpleLite 退出由用户自己负责（关窗口 / 任务管理器 / 调度内核异常退出）。
    ///
    /// true 仍可用：会启动 Windows JobObject 父子绑定（仅 Windows 有效）+ 注册 ApplicationStopping 软关闭。
    /// 一般只在临时联调期 / CI 流水线想自动清理时打开。
    /// </summary>
    public bool FollowParent { get; set; } = false;

    /// <summary>
    /// 平台拉起 SimpleLite 时是否以「迷榖嵌入画布」模式运行（透传命令行 <c>--migu</c>），默认 <b>true</b>。
    ///
    /// true：平台 iframe 嵌入场景，SimpleLite WebTerminal 默认只显示 3D 画布、隐藏所有 ImGui panel，
    ///   业务 UI 全部由 Vue 平台前端接管；declare 时序失败时也安全回退到纯画布。
    /// false：平台拉起的 SimpleLite web 端默认显示完整 panel（便于把平台拉起的实例直连 :8223 调试）。
    ///
    /// 与 LaunchMode（web / web+local，是否保留本地调试窗口）正交，可任意组合。
    /// </summary>
    public bool EmbeddedCanvas { get; set; } = true;
}
