"""
Regenera UNA imagen con un prompt literal, sin pasar por los bloques ni por el
ensamblador. Para cuando tu revisas 'REVISAR PROMPT' y corriges un prompt a mano.

    python Engine/regen_literal.py --out "explicit/REVISAR PROMPT/02_b09_Raiden_shogun_explicit_v1.png" --prompt-file prompts.txt
    python Engine/regen_literal.py --out ... --prompt "texto aqui"

El negative sale de Config/master_prompt.yaml (el de siempre).
"""
import argparse
import base64
import json
import sys
import time
from datetime import datetime
from pathlib import Path

BASE_DIR = Path(__file__).resolve().parent.parent
sys.path.insert(0, str(Path(__file__).resolve().parent))
from prompt_builder import PromptBuilder  # noqa: E402

TEST_BLOCKS = BASE_DIR / "Output" / "test_blocks"
FORGE = "http://127.0.0.1:7860"


def main():
    p = argparse.ArgumentParser(description="Genera con un prompt literal")
    p.add_argument("--out", required=True, help="ruta relativa a Output/test_blocks/")
    p.add_argument("--prompt", help="el prompt tal cual")
    p.add_argument("--prompt-file", help="lee el prompt de un .txt")
    p.add_argument("--seed", type=int, default=-1)
    p.add_argument("--steps", type=int, default=28)
    p.add_argument("--width", type=int, default=832)
    p.add_argument("--height", type=int, default=1216)
    args = p.parse_args()

    if args.prompt:
        pos = args.prompt
    elif args.prompt_file:
        pos = Path(args.prompt_file).read_text(encoding="utf-8").strip()
    else:
        raise SystemExit("[!] falta --prompt o --prompt-file")

    B = PromptBuilder(str(BASE_DIR))
    neg = B.negative_prompt

    out = TEST_BLOCKS / args.out
    out.parent.mkdir(parents=True, exist_ok=True)

    import requests
    payload = {
        "prompt": pos, "negative_prompt": neg,
        "width": args.width, "height": args.height, "steps": args.steps,
        "cfg_scale": 5.0, "sampler_name": "DPM++ 2M Karras",
        "batch_size": 1, "n_iter": 1, "seed": args.seed, "clip_skip": 2,
    }
    print(f"[-] Forge ...")
    try:
        r = requests.get(f"{FORGE}/sdapi/v1/options", timeout=15)
        print(f"[-] checkpoint: {r.json().get('sd_model_checkpoint','?')}")
    except Exception as e:
        print(f"[!] Forge NO responde ({e})")

    t0 = time.time()
    resp = requests.post(f"{FORGE}/sdapi/v1/txt2img", json=payload, timeout=300)
    resp.raise_for_status()
    data = resp.json()
    out.write_bytes(base64.b64decode(data["images"][0]))
    try:
        seed = json.loads(data.get("info", "{}")).get("seed", "?")
    except Exception:
        seed = "?"

    # manifiesto al lado: el prompt exacto con el que se genero esto
    stamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    man = out.with_name(f"regen_{stamp}.json")
    man.write_text(json.dumps({
        "file": out.name, "path": str(out.relative_to(BASE_DIR)),
        "seed": seed, "steps": args.steps, "cfg_scale": 5.0,
        "sampler": "DPM++ 2M Karras", "clip_skip": 2,
        "size": f"{args.width}x{args.height}",
        "prompt": pos, "negative_prompt": neg,
    }, ensure_ascii=False, indent=1), encoding="utf-8")

    print(f"[OK] {time.time()-t0:.0f}s seed={seed} -> {out}")
    print(f"[OK] {man.name} (prompt exacto + parametros)")


if __name__ == "__main__":
    main()