import os, base64, time, requests, json
from pathlib import Path

ROOT = Path(r"C:\Users\Usuario\Downloads\SD")
OUT = ROOT / "Output" / "test_momo_cosplay3"
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")
CHAR = "<lora:ayase_momo-koto-Illustrious v01:0.8> ayasemomo, hair between eyes, crossed bangs, green earrings, brown hair, red eyes, short hair, half naked"
OUTFIT = "playboy_bunny, leotard, black_leotard, wrist_cuffs, bow, bowtie, areola_slip, blush, detached_collar, black_bowtie, strapless_leotard, bare_shoulders, covered_navel, strapless, highleg"
BASE_POSE = "cosplay, bat_print, pantyhose, jewelry, earrings, moon, black_choker, leotard, animal_print, print_pantyhose, choker, purple_pantyhose, bare_shoulders, looking_at_viewer, night, full_moon, covered_navel, sky, black_leotard, clothing_cutout, night_sky"

variants = [
    ("base", "standing, hand on hip, weight on one leg, arched back, chest forward, confident expression"),
    ("doggystyle", "doggystyle, all_fours, arched spine, hips raised, from behind, penetration, open mouth, blush, looking back, outdoors, night, night_sky, moon, sky, saliva, pre-cum"),
    ("missionary", "missionary, lying on back, legs on shoulders, embracing, kissing, open mouth, blush, outdoors, night, moon, sky, saliva"),
    ("cowgirl", "cowgirl position, straddling, riding, bouncing, hands on partner's shoulders, open mouth, blush, outdoors, night, moon, sky, saliva, pre-cum"),
    ("cunnilingus", "cunnilingus, lying, spread legs, tongue out, open mouth, blush, looking at viewer, outdoors, night, moon, sky, saliva"),
]

NEG = ("lowres, bad anatomy, bad hands, error, missing fingers, extra digit, fewer digits, cropped, worst quality, "
       "low quality, normal quality, jpeg artifacts, signature, watermark, username, blurry, artist name, bad feet, "
       "multiple views, splits, 2girls, extra people, duplicate_character, cloned_character, similar_character, "
       "ugly, deformed, disfigured, mutation, mutated, extra_limbs, extra_arms, extra_legs, fused_fingers, "
       "long_neck, cross-eyed, censored, mosaic censoring, bar censor, mirror, reflection, mirrored, glass_reflection, "
       "reflective_surface")

API = "http://127.0.0.1:7860/sdapi/v1/txt2img"
manifest = []
for idx, (name, extra) in enumerate(variants, 1):
    pose_block = BASE_POSE if not extra else BASE_POSE + ", " + extra
    # add half naked to the pose block as well
    pose_block = pose_block + ", half naked"
    prompt = f"{MASTER} BREAK {CHAR} BREAK {pose_block}"
    payload = {
        "prompt": prompt,
        "negative_prompt": NEG,
        "width": 832,
        "height": 1216,
        "steps": 28,
        "sampler_name": "DPM++ 2M Karras",
        "cfg_scale": 7,
        "seed": -1,
        "batch_size": 1,
        "n_iter": 1,
        "override_settings": {"CLIP_stop_at_last_layers": 2},
    }
    print(f"[{idx}/{len(variants)}] {name} -> generating (seed=-1, half naked in pose block)...")
    try:
        r = requests.post(API, json=payload, timeout=300)
        r.raise_for_status()
        data = r.json()
        b64 = data["images"][0]
        if "," in b64:
            b64 = b64.split(",", 1)[1]
        info = data.get("info", "")
        real_seed = None
        try:
            info_json = json.loads(info)
            real_seed = info_json.get("seed")
        except Exception:
            import re
            m = re.search(r'"seed":\s*(\d+)', info)
            if m:
                real_seed = int(m.group(1))
        if real_seed is None:
            real_seed = "unknown"
        out_path = OUT / f"momo_cosplay3_{idx:02d}_{name}_s{real_seed}.png"
        out_path.write_bytes(base64.b64decode(b64))
        print(f"  OK -> {out_path.name} (seed={real_seed})")
        manifest.append({"file": out_path.name, "name": name, "seed": real_seed, "prompt": prompt})
    except Exception as e:
        print(f"  ERROR: {e}")
    time.sleep(1)

(OUT / "manifest.json").write_text(json.dumps(manifest, indent=2, ensure_ascii=False), encoding="utf-8")
print("DONE")