using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using MiGu.Server.Launcher;

namespace MiGu.Server.Controllers;

[ApiController]
[Route("api/health")]
public class HealthController : ControllerBase
{
    private static readonly DateTimeOffset StartTime = DateTimeOffset.UtcNow;
    private readonly SimpleLiteLauncher _launcher;

    public HealthController(SimpleLiteLauncher launcher) => _launcher = launcher;

    /// <summary>匿名存活探针：仅返回进程级状态，不暴露端口拓扑等部署细节。</summary>
    [HttpGet]
    public IActionResult Get()
    {
        return Ok(new
        {
            status = "ok",
            startTime = StartTime,
            uptimeSec = (long)(DateTimeOffset.UtcNow - StartTime).TotalSeconds
        });
    }

    /// <summary>
    /// SimpleLite 拉起配置诊断：查看当前 ExecutablePath、解析结果、端口是否已有服务。
    /// 配置位置：<c>MiGu.Server/appsettings.json</c> → <c>SimpleLite</c> 节点。
    /// 含服务器本地路径等敏感信息，要求登录。
    /// </summary>
    [HttpGet("simplelite")]
    [Authorize]
    public IActionResult GetSimpleLiteDiagnostics() => Ok(_launcher.GetDiagnostics());

    /// <summary>关闭本机全部 SimpleLite 进程。仅 Platform 管理端可调。</summary>
    [HttpPost("simplelite/stop")]
    [Authorize(Policy = "PlatformScope")]
    public IActionResult StopSimpleLite()
    {
        var killed = _launcher.StopAll();
        var diag = _launcher.GetDiagnostics();
        return Ok(new { killed, diagnostics = diag });
    }

    /// <summary>关闭并重新拉起 SimpleLite（不同步 DLL）。仅 Platform 管理端可调。</summary>
    [HttpPost("simplelite/restart")]
    [Authorize(Policy = "PlatformScope")]
    public IActionResult RestartSimpleLite([FromQuery] string launchMode = "webonly")
    {
        var result = _launcher.Restart(launchMode);
        var diag = _launcher.GetDiagnostics();
        return Ok(new { restart = result, diagnostics = diag });
    }

    /// <summary>
    /// 关闭 SimpleLite、同步最新 DLL、重新拉起。用于「前往站点」API 缺失时一键更新。
    /// 会终止本机全部 SimpleLite 进程并重启，仅 Platform 管理端可调。
    /// </summary>
    [HttpPost("simplelite/restart-for-update")]
    [Authorize(Policy = "PlatformScope")]
    public IActionResult RestartSimpleLiteForUpdate([FromQuery] string launchMode = "webonly")
    {
        var result = _launcher.RestartForUpdate(launchMode);
        var diag = _launcher.GetDiagnostics();
        return Ok(new { restart = result, diagnostics = diag });
    }
}
