using System.ComponentModel.DataAnnotations;
using System.Text.Json.Serialization;

namespace XPrintServer.Api.Entities.Vol
{
    /// <summary>
    /// 扩图DTO
    /// </summary>
    public class OutPaintingRequest
    {
        /// <summary>
        /// 算法名称
        /// </summary>
        /// <remarks>
        /// 取固定值为i2i_outpainting
        /// </remarks>

        [JsonPropertyName("req_key")]
        [Required]
        public string ReqKey { get; set; } = "i2i_outpainting";


        /// <summary>
        /// 输入图片base64数组：
        /// 0：输入图片，三通道RGB图
        /// 1：输入mask，单通道灰度图，待扩充区域对应255(即白色区域)，原图保持部分对应0(即黑色区域)
        ///（与 image_urls 二选一）
        ///// </summary>
        //[JsonPropertyName("binary_data_base64")]
        //[Required]
        //public string[] BinaryDataBase64 { get; set; } = Array.Empty<string>();

        /// <summary>
        /// 输入图片url
        /// 0：输入图片，三通道RGB图
        /// 1：输入mask，单通道灰度图，待扩充区域对应255(即白色区域)，原图保持部分对应0(即黑色区域)
        /// （与 binary_data_base64 二选一）
        /// </summary>
        [JsonPropertyName("image_urls")]
        [Required]
        public string[] ImageUrls { get; set; } = Array.Empty<string>();


        /// <summary>
        /// 用于生成图像的提示词，支持中英文输入，建议内容简洁准确，控制在100中文字/英文单词以内，超出部分对生成效果影响较小，此字段会过审核（可选）
        /// </summary>
        [JsonPropertyName("custom_prompt")]
        public string CustomPrompt { get; set; } = string.Empty;


        /// <summary>
        /// 输出是否返回图片链接 （链接有效期为24小时）（可选）
        /// </summary>
        [JsonPropertyName("return_url")]
        public bool ReturnUrl { get; set; }



        /// <summary>
        /// 采样步数，生成图像的精细程度，越大效果可能更好，但相应的耗时会剧增（可选）
        /// 默认值：30
        /// </summary>
        [JsonPropertyName("steps")]
        public int Steps { get; set; } = 30;


        /// <summary>
        /// 取值范围[0.0,1.0]，越小越接近原图，越大越接近文本控制，如果设成0就和原图一模一样（可选）
        /// 默认值：0.8
        /// </summary>
        [Range(0f, 1.0f)]
        [JsonPropertyName("strength")]
        public float Strength { get; set; } = 0.8f;


        /// <summary>
        /// 取值范围[1, 20]，影响文本描述的程度（可选）
        /// 默认值：7.0
        /// </summary>
        [Range(1f, 20.0f)]
        [JsonPropertyName("scale")]
        public float Scale { get; set; } = 7.0f;


        /// <summary>
        /// 随机种子，作为确定扩散初始状态的基础，非负数(-1表示随机种子)。若随机种子为相同正整数且其他参数均一致，则生成图片极大概率效果一致（可选）
        /// 默认值：0
        /// </summary>
        [Range(1f, 20.0f)]
        [JsonPropertyName("seed")]
        public int Seed { get; set; } = 0;

        /// <summary>
        /// 取值范围：(0,1]，向上扩展比例，暂定最大扩展单边1倍（可选）
        /// 默认值：0.1
        /// </summary>
        [Range(0f, 1f)]
        [JsonPropertyName("top")]
        public float Top { get; set; } = 0.1f;


        /// <summary>
        /// 取值范围：(0,1]，向下扩展比例，暂定最大扩展单边1倍（可选）
        /// 默认值：0.1
        /// </summary>
        [Range(0f, 1f)]
        [JsonPropertyName("bottom")]
        public float Bottom { get; set; } = 0.1f;

        /// <summary>
        /// 取值范围：(0,1]，向左扩展比例，暂定最大扩展单边1倍（可选）
        /// 默认值：0.1
        /// </summary>
        [Range(0f, 1f)]
        [JsonPropertyName("left")]
        public float Left { get; set; } = 0.1f;

        /// <summary>
        /// 取值范围：(0,1]，向右扩展比例，暂定最大扩展单边1倍（可选）
        /// 默认值：0.1
        /// </summary>
        [Range(0f, 1f)]
        [JsonPropertyName("right")]
        public float Right { get; set; } = 0.1f;


        /// <summary>
        /// 最大输出高度（可选）
        /// 默认值：1920，在扩图处理后resize到指定尺寸进行兜底
        /// </summary>
        [JsonPropertyName("max_height")]
        public int MaxHeight { get; set; } = 1920;


        /// <summary>
        /// 最大输出宽度（可选）
        /// 默认值：1920，在扩图处理后resize到指定尺寸进行兜底
        /// </summary>
        [JsonPropertyName("max_width")]
        public int MaxWidth { get; set; } = 1920;

        /// <summary>
        /// 水印信息（可选）
        /// </summary>
        [JsonPropertyName("logo_info")]
        public LogoInfo LogoInfo { get; set; } = new LogoInfo();
    }
}
