import os
import sys
import random
import logging
from datetime import datetime

sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))

from api_client import ForgeClient, VisionClient
from prompt_builder import PromptBuilder
from vision_critic import VisionCritic

BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
OUTPUT_DIR = os.path.join(BASE_DIR, "Output", "campaigns_X")
LOGS_DIR = os.path.join(BASE_DIR, "Logs")

os.makedirs(OUTPUT_DIR, exist_ok=True)
os.makedirs(LOGS_DIR, exist_ok=True)

logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s [%(levelname)s] %(message)s",
    handlers=[
        logging.FileHandler(os.path.join(LOGS_DIR, "test.log"), encoding="utf-8"),
        logging.StreamHandler()
    ]
)
logger = logging.getLogger(__name__)

def main():
    import yaml
    config_path = os.path.join(BASE_DIR, "Config", "plumloom_engine.yaml")
    with open(config_path, "r", encoding="utf-8") as f:
        config = yaml.safe_load(f)

    forge_cfg = config["endpoints"]["forge_neo"]
    forge = ForgeClient(url=forge_cfg["url"], timeout=forge_cfg["timeout"])

    vision_cfg = config["endpoints"]["vision"]
    vision = VisionClient(
        url=vision_cfg["url"],
        model=vision_cfg["model"],
        timeout=vision_cfg["timeout"]
    )

    builder = PromptBuilder(BASE_DIR)

    print("=" * 55)
    print("  PLUMLOOM ENGINE v2 - PRUEBA RAPIDA")
    print("=" * 55)

    print(f"\nVerificando Forge Neo...")
    if not forge.check_status():
        print("[X] Forge Neo NO responde. Verifica que esté abierto con --api")
        return
    print("[OK] Forge Neo conectado")

    names = builder.get_character_names()
    print(f"[OK] {len(names)} personajes cargados")
    print(f"[OK] {len(builder.wildcards)} wildcards cargados")

    random_char = random.choice(names)
    print(f"\nPersonaje seleccionado: {random_char}")

    prompt_pos, prompt_neg = builder.build_random(
        character_name=random_char,
        spice_level="suggestive"
    )

    print(f"\nPrompt positivo (completo):")
    print(f"  {prompt_pos}")
    print(f"\nPrompt negativo (completo):")
    print(f"  {prompt_neg}")

    gen_cfg = config["generation"]
    print(f"\nGenerando imagen ({gen_cfg['width']}x{gen_cfg['height']}, {gen_cfg['steps']} steps)...")

    images, info = forge.txt2img(
        prompt=prompt_pos,
        negative_prompt=prompt_neg,
        width=gen_cfg["width"],
        height=gen_cfg["height"],
        steps=gen_cfg["steps"],
        cfg_scale=gen_cfg["cfg_scale"],
        sampler_name=gen_cfg["sampler_name"],
        clip_skip=gen_cfg["clip_skip"]
    )

    if not images:
        print("[X] Forge no devolvió imágenes")
        return

    image_bytes = images[0]
    seed = info.get("seed", 0)
    print(f"[OK] Imagen generada (seed: {seed})")

    print("\nEnviando a critico visual (OVHcloud Qwen2.5-VL)...")
    critic = VisionCritic(vision_client=vision, delay_between_requests=31)
    approved, verdict, details = critic.full_audit(image_bytes)

    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")

    if approved:
        filename = f"test_{timestamp}_seed{seed}.png"
        filepath = os.path.join(OUTPUT_DIR, filename)
        forge.save_image(image_bytes, filepath)
        print(f"[OK] APROBADA -> {filepath}")
    else:
        rejected_dir = os.path.join(BASE_DIR, "Output", "rejected")
        os.makedirs(rejected_dir, exist_ok=True)
        filename = f"test_{timestamp}_rej.png"
        filepath = os.path.join(rejected_dir, filename)
        forge.save_image(image_bytes, filepath)
        print(f"[X] RECHAZADA: {verdict}")
        print(f"  Guardada en: {filepath}")

    print("\n" + "=" * 55)
    print("  PRUEBA COMPLETADA")
    print("=" * 55)

if __name__ == "__main__":
    main()