using Ayay.SerilogLogs;
using Newtonsoft.Json.Linq;
using Serilog;
using SHH.CameraSdk;
using SHH.Contracts;

namespace SHH.CameraService;

/// <summary>
/// 设备时间同步处理器
/// 响应 gRpc 指令：ProtocolCodes.Time_Sync
/// </summary>
public class TimeSyncHandler : ICommandHandler
{
    private readonly ILogger _sysLog = Log.ForContext("SourceContext", LogModules.Core);
    private readonly CameraManager _cameraManager;

    // Optimized: 需在 ProtocolCodes 中定义此常量，确保与网关下发的 CmdCode 对应
    public string ActionName => ProtocolCodes.Device_TimeSync;

    public TimeSyncHandler(CameraManager cameraManager)
    {
        _cameraManager = cameraManager ?? throw new ArgumentNullException(nameof(cameraManager));
    }

    public async Task ExecuteAsync(JToken payload)
    {
        // 1. 解析基础参数
        var deviceId = payload["DeviceId"]?.Value<int>() ?? 0;
        var method = payload["Method"]?.Value<string>()?.ToLower(); // "get" 或 "set"

        if (deviceId <= 0)
        {
            _sysLog.Warning("[TimeSync] 无效指令：设备ID非法");
            return;
        }

        // 2. 获取设备并校验能力
        var device = _cameraManager.GetDevice(deviceId);
        if (device == null)
        {
            _sysLog.Warning($"[TimeSync] 设备 {deviceId} 不存在");
            return;
        }

        // Modified: 根据 ISyncFeature.cs 校验是否实现 ITimeSyncFeature 接口
        if (!(device is ITimeSyncFeature syncFeature))
        {
            _sysLog.Warning($"[TimeSync] 设备 {deviceId} 不支持时间同步功能");
            return;
        }

        // 3. 业务逻辑分支
        try
        {
            if (method == "set")
            {
                // 解析待设置的时间，若无则默认使用服务器当前系统时间
                var targetTime = payload["SyncTime"]?.Value<DateTime>() ?? DateTime.Now;

                // 调用接口设置时间
                await syncFeature.SetTimeAsync(targetTime);
                _sysLog.Information($"[TimeSync] 设备 {deviceId} 时间已同步为: {targetTime:yyyy-MM-dd HH:mm:ss}");
            }
            else
            {
                // 执行获取时间
                var deviceTime = await syncFeature.GetTimeAsync();
                _sysLog.Information($"[TimeSync] 获取设备 {deviceId} 当前时间成功: {deviceTime:yyyy-MM-dd HH:mm:ss}");

                // TODO: 若需要将结果返回给网关，需在此处调用 GatewayService 异步回传
            }
        }
        catch (Exception ex)
        {
            _sysLog.Error(ex, $"[TimeSync] 设备 {deviceId} 操作失败 ({method})");
        }
    }
}