package ml

import (
	"fmt"
	"strconv"
)

// samplerMap traduce nombres canonicos del dominio ml a flags de stable-diffusion.cpp.
var samplerMap = map[string]string{
	"euler":       "euler",
	"euler_a":     "euler_a",
	"dpm++2m":     "dpmpp2m",
	"dpm++2m_v2":  "dpmpp2mv2",
	"heun":        "heun",
	"dpm2":        "dpm2",
	"lcm":         "lcm",
}

// GenconfigToSdcliArgs convierte un GenerationConfig en una lista de argumentos
// CLI para stable-diffusion.cpp (sd.exe / sd binario).
// Espejo Go de genconfig_to_sdcpp_args_py_ml.
//
// Loras se emiten como pares repetidos "--lora" "path:weight".
// Si el sampler no existe en samplerMap se usa el valor literal sin traducir.
// La funcion es pura: sin I/O, sin estado, determinista.
func GenconfigToSdcliArgs(cfg GenerationConfig) []string {
	args := []string{
		"--prompt", cfg.Prompt,
		"--seed", strconv.FormatInt(cfg.Seed, 10),
		"--steps", strconv.Itoa(cfg.Steps),
		"--cfg-scale", strconv.FormatFloat(cfg.CfgScale, 'f', -1, 64),
		"--width", strconv.Itoa(cfg.Width),
		"--height", strconv.Itoa(cfg.Height),
	}

	if cfg.NegativePrompt != "" {
		args = append(args, "--negative-prompt", cfg.NegativePrompt)
	}

	sampler := cfg.Sampler
	if mapped, ok := samplerMap[sampler]; ok {
		sampler = mapped
	}
	args = append(args, "--sampling-method", sampler)

	if cfg.Model.Path != "" {
		args = append(args, "--model", cfg.Model.Path)
	}

	if cfg.ClipSkip != nil {
		args = append(args, "--clip-skip", strconv.Itoa(*cfg.ClipSkip))
	}

	for _, lora := range cfg.Loras {
		args = append(args, "--lora", fmt.Sprintf("%s:%g", lora.Path, lora.Weight))
	}

	return args
}
