using Ayay.SerilogLogs;
using Microsoft.Extensions.Hosting;
using Serilog;
using SHH.CameraSdk;

/// <summary>
/// 设备管理服务引擎 Worker
/// </summary>
public class CameraEngineWorker : BackgroundService
{
    private readonly CameraManager _manager;

    public CameraEngineWorker(CameraManager manager)
    {
        // 理由：严谨性检查，防止因配置错误导致的空指针崩溃
        _manager = manager ?? throw new ArgumentNullException(nameof(manager));
    }

    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        var sysLog = Log.ForContext("SourceContext", LogModules.Core);
        sysLog.Information("[Engine] 正在启动设备管理服务引擎...");

        try
        {
            // 1. 理由：启动 SDK 内部加载流程（从本地存储恢复设备）
            await _manager.StartAsync();
            sysLog.Warning("[Engine] 设备管理服务引擎已启动...");
        }
        catch (Exception ex)
        {
            sysLog.Error($"[Engine] 设备管理服务引擎启动异常: {ex.Message}");
            return; // 理由：核心组件失败，终止后续逻辑
        }

        // 2. 理由：Worker 必须保持活跃状态，以便作为宿主生命周期的一部分
        while (!stoppingToken.IsCancellationRequested)
        {
            // 你可以在这里定期输出一些状态统计
            sysLog.Debug($"[Engine] 管理设备数: {_manager.GetAllCameras().Count()}");
            await Task.Delay(TimeSpan.FromSeconds(30), stoppingToken);
        }
    }

    public override async Task StopAsync(CancellationToken cancellationToken)
    {
        var sysLog = Log.ForContext("SourceContext", LogModules.Core);
        sysLog.Debug($"[Engine] 正在执行优雅停机: {_manager.GetAllCameras()}");
        try
        {
            // 理由：这是重构的核心。必须在 SDK 退出前释放所有非托管句柄
            await _manager.DisposeAsync();
        }
        finally
        {
            await base.StopAsync(cancellationToken);
        }
    }
}