namespace Services.Fooocus
{
    public class Lora
    {
        public bool enabled { get; set; } = false;
        public string model_name { get; set; } = "sd_xl_offset_example-lora_1.0.safetensors";
        public double weight { get; set; } = 0.5;
    }

    public class FooocusRequest_Text_to_Image
    {
        public string prompt { get; set; } = "";
        public string negative_prompt { get; set; } = "blurry, low quality, distorted, watermark, text, extra limbs, cropped";
        public string[] style_selections { get; set; } = new string[0];
        public string performance_selection { get; set; } = "Speed";//Speed, Quality, Extreme Speed
        public string aspect_ratios_selection { get; set; } = "1152*896";
        public int image_number { get; set; } = 1;
        public int image_seed { get; set; } = -1;

        public double sharpness { get; set; } = 2.0; //0-30
        public double guidance_scale { get; set; } = 4.0;//1-30

        public string base_model_name { get; set; }= "juggernautXL_v8Rundiffusion.safetensors";
        public string refiner_model_name { get; set; } = "None";
        public double refiner_switch { get; set; } = 0.5;

        public bool require_base64 { get; set; } = false;
        public bool async_process { get; set; } = false;

        public Lora[] loras { get; set; } = new Lora[0];
    }

    public class FooocusRequest 
    {
    // --- PARAMÈTRES DE BASE ---

    /// <summary>
    /// Description textuelle de l’image à générer.
    /// Exemple : "un chat steampunk sur un toit".
    /// Obligatoire.
    /// </summary>
    public string Prompt { get; set; } = "";

    /// <summary>
    /// Liste de ce que l’on veut éviter (qualité faible, flou...).
    /// Exemple : "blurry, low quality".
    /// Recommandé pour améliorer la sortie.
    /// </summary>
    public string NegativePrompt { get; set; } = "blurry, low quality, distorted, watermark, text, extra limbs, cropped";

    /// <summary>
    /// Largeur de l’image en pixels.
    /// Valeurs courantes : 512, 768, 1024.
    /// Défaut = 768.
    /// </summary>
    public int Width { get; set; } = 768;

    /// <summary>
    /// Hauteur de l’image en pixels.
    /// Valeurs courantes : 512, 768, 1024.
    /// Défaut = 768.
    /// </summary>
    public int Height { get; set; } = 768;

    /// <summary>
    /// Nombre d’itérations de diffusion (steps).
    /// Plus c’est haut, plus c’est détaillé mais lent.
    /// Recommandé : 20–40.
    /// Défaut = 30.
    /// </summary>
    public int Steps { get; set; } = 40;

    /// <summary>
    /// Influence du prompt sur le rendu (CFG scale).
    /// Valeurs typiques : 5–12.
    /// Recommandé = 7.5.
    /// </summary>
    public double GuidanceScale { get; set; } = 9.0;


    // --- STYLE & PERFORMANCE ---

    /// <summary>
    /// Liste des styles appliqués (ex. "Fooocus V2", "Fooocus Enhance").
    /// Peut rester vide.
    /// </summary>
    public string[] StyleSelections { get; set; } = new string[0];

    /// <summary>
    /// Mode de performance.
    /// Options : "Speed", "Quality", "Extreme Speed".
    /// Défaut = "Speed".
    /// </summary>
    public string PerformanceSelection { get; set; } = "Speed";

    /// <summary>
    /// À quel moment le modèle "refiner" intervient (0 = jamais, 1 = fin).
    /// Défaut = 0.5.
    /// </summary>
    public double RefinerSwitch { get; set; } = 0.0;

    /// <summary>
    /// Netteté appliquée à l’image finale.
    /// Valeurs : 1.0 (douce) à 3.0 (très nette).
    /// Défaut = 2.0.
    /// </summary>
    public double Sharpness { get; set; } = 2.0;


    // --- SEED & BATCH ---

    /// <summary>
    /// Seed de génération.
    /// -1 = aléatoire.
    /// Utiliser une seed fixe pour reproductibilité.
    /// </summary>
    public int ImageSeed { get; set; } = -1;

    /// <summary>
    /// Nombre d’images à générer en une requête.
    /// Défaut = 1.
    /// </summary>
    public int ImageNumber { get; set; } = 1;

    /// <summary>
    /// Ratio prédéfini de l’image (format).
    /// Exemple : "768*768", "1152*896".
    /// Défaut = "768*768".
    /// </summary>
    public string AspectRatiosSelection { get; set; } = "768*768";


    // --- CONTROLNET / IMAGE PROMPTS ---

    /// <summary>
    /// Première image de référence (ControlNet).
    /// Peut être une URL ou un chemin.
    /// </summary>
    public string? CnImg1 { get; set; }

    /// <summary>
    /// Type de ControlNet pour CnImg1 (ex. "Canny", "Depth", "ImagePrompt").
    /// </summary>
    public string? CnType1 { get; set; }

    /// <summary>
    /// Poids de l’influence de CnImg1 (0–1).
    /// Défaut ≈ 0.8.
    /// </summary>
    public double? CnWeight1 { get; set; }

    /// <summary>
    /// Étape à laquelle arrêter ControlNet (0–1).
    /// Défaut ≈ 0.2.
    /// </summary>
    public double? CnStop1 { get; set; }

    // (Idem pour 4 images maximum)
    public string? CnImg2 { get; set; }
    public string? CnType2 { get; set; }
    public double? CnWeight2 { get; set; }
    public double? CnStop2 { get; set; }

    public string? CnImg3 { get; set; }
    public string? CnType3 { get; set; }
    public double? CnWeight3 { get; set; }
    public double? CnStop3 { get; set; }

    public string? CnImg4 { get; set; }
    public string? CnType4 { get; set; }
    public double? CnWeight4 { get; set; }
    public double? CnStop4 { get; set; }


    // --- LORAS ---

    /// <summary>
    /// Utiliser les LoRAs par défaut du modèle.
    /// Défaut = true.
    /// </summary>
    public bool UseDefaultLoras { get; set; } = false;

    /// <summary>
    /// URLs de LoRAs personnalisés (séparés par des virgules).
    /// </summary>
    public string? LorasCustomUrls { get; set; }

    /// <summary>
    /// Poids d’influence des LoRAs.
    /// Défaut = 1.0.
    /// </summary>
    public double? LorasWeight { get; set; } = 0.0;


    // --- INPAINTING ---

    /// <summary>
    /// Image d’entrée pour l’inpainting (corriger une zone).
    /// </summary>
    public string? InpaintInputImage { get; set; }

    /// <summary>
    /// Masque de l’inpainting (zones à modifier en noir).
    /// </summary>
    public string? InpaintInputMask { get; set; }


    // --- OUTPAINTING ---

    /// <summary>
    /// Mode d’outpainting (agrandir une image au-delà des bords).
    /// Exemple : "left,right,top".
    /// </summary>
    public string? OutpaintSelections { get; set; }

    /// <summary>
    /// Distance d’extension en haut (en pixels).
    /// Défaut = 0.
    /// </summary>
    public int OutpaintDistanceTop { get; set; } = 0;

    public int OutpaintDistanceLeft { get; set; } = 0;
    public int OutpaintDistanceRight { get; set; } = 0;
    public int OutpaintDistanceBottom { get; set; } = 0;


    // --- UPSCALE / VARIATIONS ---

    /// <summary>
    /// Méthode appliquée : "Upscale", "Variation", "Outpaint".
    /// </summary>
    public string? UovMethod { get; set; }

    /// <summary>
    /// Image d’entrée pour upscale ou variation.
    /// </summary>
    public string? UovInputImage { get; set; }

}

}
