using Microsoft.AspNetCore.Mvc.ModelBinding;
using System.ComponentModel.DataAnnotations;
using System.Text.Json.Serialization;

namespace XPrintServer.Api.Entities
{
    public class KenlinImageRequest
    {
        /// <summary>
        /// 模型名称
        /// 枚举值：kling-v1, kling-v1-5, kling-v2
        /// </summary>
        [JsonPropertyName("model_name")]
        public string ModelName { get; set; } = "kling-v1";


        /// <summary>
        /// 正向文本提示词
        /// 不能超过2500个字符
        /// </summary>
        [JsonPropertyName("prompt")]
        public string Prompt { get; set; } = string.Empty;

        /// <summary>
        /// 负向文本提示词
        /// 不能超过2500个字符
        /// </summary>
        [JsonPropertyName("negative_prompt")]
        public string NegativePrompt { get; set; } = string.Empty;


        /// <summary>
        /// 参考图像
        /// 支持传入图片Base64编码或图片URL（确保可访问）
        /// 请注意，若您使用base64的方式，请确保您传递的所有图像数据参数均采用Base64编码格式。在提交数据时，请不要在Base64编码字符串前添加任何前缀，例如data:image/png;base64,。正确的参数格式应该直接
        /// Base64编码后的字符串。
        /// 示例：
        /// 正确的Base64编码参数：
        /// 1
        /// iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==
        /// 错误的Base64编码参数（包含data:前缀）：
        /// 1
        /// data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==
        /// 请仅提供Base64编码的字符串部分，以便系统能够正确处理和解析您的数据。
        /// 图片格式支持.jpg / .jpeg / .png
        /// 图片文件大小不能超过10MB，图片分辨率不小于300*300px，图片宽高比要在1:2.5 ~ 2.5:1之间
        /// image_reference参数不为空时，当前参数必填
        /// </summary>
        [JsonPropertyName("image")]
        public string Image { get; set; } = string.Empty;

        /// <summary>
        /// 图片参考类型
        /// 枚举值：subject（角色特征参考）, face（人物长相参考）
        /// 使用face（人物长相参考）时，上传图片需仅含1张人脸。
        /// 使用 kling-v1-5 且 image 参数不为空时，当前参数必填
        /// 仅 kling-v1-5 支持当前参数
        /// </summary>
        [JsonPropertyName("image_reference")]
        public string ImageReference { get; set; } = "subject";


        /// <summary>
        /// 生成过程中对用户上传图片的参考强度
        /// 取值范围：[0, 1]，数值越大参考强度越大
        /// </summary>
        [JsonPropertyName("image_fidelity")]
        [Range(0f, 1f)]
        public float ImageFidelity { get; set; } = 0.5f;

        /// <summary>
        /// 面部参考强度，即参考图中人物五官相似度
        /// 仅 image_reference 参数为 subject 时生效
        /// 取值范围：[0, 1]，数值越大参考强度越大
        /// </summary>
        [JsonPropertyName("human_fidelity")]
        [Range(0f, 1f)]
        public float HumanFidelity { get; set; } = 0.45f;


        /// <summary>
        /// 生成图片的清晰度
        /// ● 枚举值：1k, 2k
        /// ○ 1k：1K标清
        /// ○ 2k：2K高清
        /// 不同模型版本支持范围不同，详见当前文档2-0能力地图
        /// </summary>
        [JsonPropertyName("resolution")]
        public string Resolution { get; set; } = "1k";

        /// <summary>
        /// 生成图片数量
        /// 取值范围：[1, 9]
        /// </summary>
        [JsonPropertyName("n")]
        [Range(1, 9)]
        public int N { get; set; } = 1;

        /// <summary>
        /// 生成图片的画面纵横比（宽:高）
        /// 枚举值：16:9, 9:16, 1:1, 4:3, 3:4, 3:2, 2:3, 21:9
        /// 不同模型版本支持的范围不同，详见能力地图
        /// </summary>
        [JsonPropertyName("aspect_ratio")]
        public string AspectRatio { get; set; } = "16:9";

        /// <summary>
        /// 本次任务结果回调通知地址，如果配置，服务端会在任务状态发生变更时主动通知
        /// 具体通知的消息schema见“Callback协议”
        /// </summary>
        [JsonPropertyName("callback_url")]
        public string CallbackUrl { get; set; } = string.Empty;

    }
}
