# A/B outfits: maid (Akeno) y gym (Mitsuki) sobre otros personajes.
# Maid -> Tsunade (adulta, análoga a Akeno) y Lauma.
# Gym  -> Sarada (joven) y Nakano Nino (pelo rosa, otro arquetipo).
# Objetivo: saber si deriva es del LoRA del personaje o del outfit/half naked.

import json
import pathlib
import sys

sys.path.insert(0, "Engine")
from api_client import ForgeClient

BASE = pathlib.Path(r"C:\Users\Usuario\Downloads\SD")
OUT = BASE / "Output" / "test_outfits_ab"
OUT.mkdir(parents=True, exist_ok=True)

MASTER = """masterpiece, best quality, highly detailed, sharp focus, very aesthetic, very awa,
detailed background, score_9, score_8_up, <lora:IFL_v1.0_IL:0.7> <lora:add-detail-xl:0.5>
<lora:blackwhiplash(bwl)-guy90-Illust-Lorav3:0.6> blaash, <lora:scara2b_ill_v1.00:0.7> scara2b-style,
<lora:Add_color_ILXLv1:3>, 1girl, solo"""

NEG = ("lowres, bad anatomy, bad hands, extra fingers, missing fingers, extra limbs, missing limbs, "
       "fused fingers, poorly drawn face, poorly drawn hands, censored, mosaic censoring, bar censor, "
       "mirror, reflection")

TSUNADE = "<lora:Tsunade_illustrious_v1:0.8> Tsunade, tsunade_(naruto), 1girl, blonde_hair, large_breasts, brown_eyes, forehead_mark, facial_mark, mature_female"
LAUMA = "<lora:Lauma_ILv3.1:0.8> laumagenshin, hair intakes, pointy ears, long hair, hair over one eye, antlers, purple hair, bangs, hair ornament, large breasts, blue eyes, ear piercing, cleavage, bare shoulders, blue nails, nail polish"
SARADA = "<lora:Sarada_Uchiha:0.8> Sarada, black_hair, short_hair, black eyes, large_breasts, glasses, short body"
NINO = "<lora:nakano_nino:0.8> nakano_nino, short_hair, blue_eyes, pink_hair, butterfly_hair_ornament"

MAID = "maid, maid_apron, frilled_apron, frilled_skirt, white_apron, tiara, black_ribbon, high_heels, half naked"
GYM = "gym_uniform, white_shirt, collared_shirt, white_skirt, pencil_skirt, half naked"

TESTS = [
    ("tsunade_maid", TSUNADE, MAID, "tsunade_maid"),
    ("lauma_maid", LAUMA, MAID, "lauma_maid"),
    ("sarada_gym", SARADA, GYM, "sarada_gym"),
    ("nino_gym", NINO, GYM, "nino_gym"),
]

POSES = [
    "standing, hand on hip, weight on one leg, smiling, indoors, dining room, table, from front",
    "standing, holding tray, serving pose, indoors, kitchen counter, smile, from front",
]

client = ForgeClient("http://127.0.0.1:7860")
assert client.check_status(), "Forge no responde"

manifest = []
for name, char_line, outfit, _ in TESTS:
    for i, pose in enumerate(POSES, 1):
        prompt = (f"{MASTER}\nBREAK\n1girl, {char_line}, {outfit}\n"
                  f"BREAK\n{pose}")
        images, info = client.txt2img(prompt, negative_prompt=NEG, width=832, height=1216,
                                      steps=28, cfg_scale=6.0, seed=-1)
        for j, img in enumerate(images, 1):
            fname = f"{name}_{i:02d}_{j}.png"
            (OUT / fname).write_bytes(img)
            manifest.append({"file": fname, "test": name, "pose": pose, "prompt": prompt,
                             "seed": info.get("seed")})
            print(f"[OK] {fname} seed={info.get('seed')}")

(OUT / "manifest.json").write_text(json.dumps(manifest, ensure_ascii=False, indent=1), encoding="utf-8")
print(f"[OK] {OUT} ({len(manifest)} imgs)")
