using System.Text.Json;

namespace SHH.CameraDashboard
{
    public partial class CameraRepository
    {
        public async Task<bool> UpdateImageProcessingAsync(CameraEditInfo dto)
        {
            if (dto == null) return false;

            var serviceNode = AppGlobal.UseServiceNode;
            if (serviceNode == null) return false;

            // 1. 使用专用的 Processing 路由
            string requestUrl = $"http://{serviceNode.ServiceNodeIp}:{serviceNode.ServiceNodePort}{WebApiRoutes.Cameras.Processing(dto.Id.ToString())}";

            // 2. 解析分辨率字符串 (例如 "1920x1080" -> 1920, 1080)
            int width = 1280; // 默认值
            int height = 720;

            if (!string.IsNullOrWhiteSpace(dto.TargetResolution))
            {
                var parts = dto.TargetResolution.ToLower().Split('x');
                if (parts.Length == 2)
                {
                    int.TryParse(parts[0], out width);
                    int.TryParse(parts[1], out height);
                }
            }

            try
            {
                // 2. 构建精简的专用 JSON Payload
                // 只包含图像处理相关的字段，不发送其他干扰信息
                var payload = new
                {
                    // --- 分辨率 (拆分成 int) ---
                    targetWidth = width,
                    targetHeight = height,

                    // 确保这些字段名与后端 Processing 接口的定义一致
                    useGrayscale = dto.UseGrayscale,
                    enhanceImage = dto.EnhanceImage,

                    // 缩放控制
                    allowShrink = dto.AllowShrink,
                    allowEnlarge = dto.AllowEnlarge, // 这里使用你确认过的 AllowEnlarge

                    // 目标分辨率
                    targetResolution = dto.TargetResolution ?? ""
                };

                string jsonBody = JsonHelper.Serialize(payload);

                // 3. 发送请求
                // 通常专用功能接口使用 POST 或 PUT。根据你的路由命名(Processing 是名词/动词)，
                // 且是对资源的部分修改，PUT 的可能性较大；但如果是“执行处理”，也可能是 POST。
                // 建议先试 PUT (因为是 Update 操作)，如果报 405 则改 POST。
                await WebApiService.Instance.PostAsync(requestUrl, jsonBody, "图像处理配置");

                return true;
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine($"更新图像处理配置失败: {ex.Message}");
                return false;
            }
        }

        /// <summary>
        /// [新增] 获取指定设备的图像处理配置
        /// 对应后端: GET /api/cameras/{id}/processing
        /// </summary>
        public async Task<CameraEditInfo> GetImageProcessingAsync(long id)
        {
            var serviceNode = AppGlobal.UseServiceNode;
            if (serviceNode == null) return null;

            // 1. 拼接 URL: http://.../api/Cameras/1001/processing
            string requestUrl = $"http://{serviceNode.ServiceNodeIp}:{serviceNode.ServiceNodePort}{WebApiRoutes.Cameras.Root}/{id}/processing";

            try
            {
                // 2. 发送 GET 请求
                string jsonResponse = await WebApiService.Instance.GetAsync(requestUrl, "获取图像处理配置");
                if (string.IsNullOrEmpty(jsonResponse)) return null;

                // 3. 解析后端返回的 ProcessingOptions JSON
                // 注意：这里定义一个临时类来匹配后端 JSON 结构，确保字段名一致
                var options = JsonHelper.Deserialize<ProcessingOptionsDto>(jsonResponse);
                if (options == null) return null;

                // 4. 映射回 CameraEditInfo 给 ViewModel 使用
                return new CameraEditInfo
                {
                    Id = id,
                    // 将宽高拼回 "1920x1080" 格式
                    TargetResolution = $"{options.targetWidth}x{options.targetHeight}",

                    // 映射开关 (注意字段名对应关系)
                    AllowShrink = options.enableShrink,
                    AllowEnlarge = options.enableExpand, // 后端叫 EnableExpand
                    EnhanceImage = options.enableBrightness
                };
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine($"[Repository] 获取图像配置失败: {ex.Message}");
                return null;
            }
        }

        // [内部类] 用于接收后端 JSON 的 DTO
        // 字段名需与后端 ProcessingOptions 序列化出来的 JSON 字段一致 (通常是 camelCase)
        private class ProcessingOptionsDto
        {
            public int targetWidth { get; set; }
            public int targetHeight { get; set; }
            public bool enableShrink { get; set; }
            public bool enableExpand { get; set; }     // 对应后端的 EnableExpand
            public bool enableBrightness { get; set; } // 对应后端的 EnableBrightness
            public int brightness { get; set; }
        }
    }
}
