using Newtonsoft.Json;
// 注意：如果不想依赖 Newtonsoft，也可以用 System.Text.Json，但 Newtonsoft 在 Std 2.0 中兼容性更好

namespace SHH.Contracts
{
    /// <summary>
    /// 视频数据传输契约（纯净版 POCO）
    /// </summary>
    public class VideoPayload
    {
        /// <summary>
        /// 构造函数
        /// </summary>
        public VideoPayload()
        {
            SubscriberIds = new List<string>(16);
            Diagnostics = new Dictionary<string, object>(4);
        }

        #region --- 1. 元数据 (Metadata) ---

        public string CameraId { get; set; } = string.Empty;

        /// <summary>采集时间戳 (Unix 毫秒)</summary>
        public long CaptureTimestamp { get; set; }

        /// <summary>分发时间戳 (Unix 毫秒)</summary>
        public long DispatchTimestamp { get; set; }

        /// <summary>原始图像宽度</summary>
        public int OriginalWidth { get; set; }

        /// <summary>原始图像高度</summary>
        public int OriginalHeight { get; set; }

        /// <summary>目标图像宽度</summary>
        public int TargetWidth { get; set; }

        /// <summary>目标图像高度</summary>
        public int TargetHeight { get; set; }

        /// <summary>订阅Ids</summary>
        public List<string> SubscriberIds { get; set; }

        /// <summary>诊断信息</summary>
        public Dictionary<string, object> Diagnostics { get; set; }

        /// <summary>
        /// 指示标志：是否存在原始图
        /// </summary>
        public bool HasOriginalImage { get; set; }

        /// <summary>
        /// 指示标志：是否存在处理图
        /// </summary>
        public bool HasTargetImage { get; set; }

        #endregion

        #region --- 2. 二进制数据 (Binary) ---

        // 标记 JsonIgnore，防止被错误序列化
        [JsonIgnore]
        public byte[]? OriginalImageBytes { get; set; }

        [JsonIgnore]
        public byte[]? TargetImageBytes { get; set; }

        #endregion

        #region --- 3. 辅助方法 (仅保留 JSON 逻辑) ---

        /// <summary>
        /// 获取纯元数据的 JSON 字符串
        /// </summary>
        public string GetMetadataJson()
        {
            // 在序列化前自动更新标志位，防止逻辑不同步
            HasOriginalImage = (OriginalImageBytes != null && OriginalImageBytes.Length > 0);
            HasTargetImage = (TargetImageBytes != null && TargetImageBytes.Length > 0);

            return JsonConvert.SerializeObject(this);
        }

        public static VideoPayload? FromMetadataJson(string json)
        {
            return JsonConvert.DeserializeObject<VideoPayload>(json);
        }

        #endregion
    }
}