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

ROOT = Path(r"C:\Users\Usuario\Downloads\SD")
OUT = ROOT / "Output" / "test_momo_cosplay"
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"
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"

# 5 variations: base + added pose/action/fluid/expression tags
variants = [
    ("base", ""),
    ("doggystyle", "doggystyle, from_behind, all_fours, sex, open_mouth, blush"),
    ("missionary", "missionary, lying_on_back, legs_on_shoulders, kissing, open_mouth, blush"),
    ("cowgirl", "cowgirl_position, straddling, riding, bouncing, open_mouth, blush"),
    ("cunnilingus", "cunnilingus, lying, spread_legs, open_mouth, tongue_out, blush"),
]

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"
for idx, (name, extra) in enumerate(variants, 1):
    pose_block = BASE_POSE if not extra else BASE_POSE + ", " + extra
    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": 4003,
        "batch_size": 1,
        "n_iter": 1,
        "override_settings": {"CLIP_stop_at_last_layers": 2},
    }
    print(f"[{idx}/{len(variants)}] {name} -> generating...")
    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]
        out_path = OUT / f"momo_cosplay_{idx:02d}_{name}.png"
        out_path.write_bytes(base64.b64decode(b64))
        print(f"  OK -> {out_path.name}")
    except Exception as e:
        print(f"  ERROR: {e}")
    time.sleep(1)

print("DONE")