# 3 ángulos por outfit: china (Tsunade), apron blanco puro (Lauma), hoodie (Yelan).
# Apron corregido: white_apron puro (no azul).

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_3angulos"
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"
YELAN = "<lora:Yelan夜蘭原神:0.8> Yelan, blue hair, short hair, green eyes, huge breasts, earrings"

CHINA = "china_dress, side_slit, mandarin_collar, white_apron"
APRON = "white_apron, apron, half naked"
HOODIE = "hoodie, oversized_sweater, panties, half naked"

ANGLES = [
    ("front", "standing, hand on hip, weight on one leg, smiling, indoors, from front"),
    ("side", "standing, side view, hands on hips, smiling, indoors, from side"),
    ("threeq", "sitting, legs crossed, leaning back, smiling, indoors, three-quarter view"),
]

TESTS = [
    ("tsunade_china", TSUNADE, CHINA),
    ("lauma_apron", LAUMA, APRON),
    ("yelan_hoodie", YELAN, HOODIE),
]

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

manifest = []
for name, char_line, outfit in TESTS:
    for ang, pose in ANGLES:
        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}_{ang}_{j}.png"
            (OUT / fname).write_bytes(img)
            manifest.append({"file": fname, "test": f"{name}_{ang}", "pose": pose, "outfit": outfit,
                             "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)")
