"""FikoYT Qwen-Image Loader — Qwen/Qwen-Image checkpoint + auto-download."""
import os

try:
    import folder_paths
    import comfy.sd
except ImportError:
    folder_paths = None
    comfy = None

from ..core import ensure_model, get_models_dir


QWEN_PRESETS = {
    "Qwen-Image (fp16)":     {"repo": "Qwen/Qwen-Image", "file": "qwen_image_fp16.safetensors"},
    "Qwen-Image (fp8)":      {"repo": "Qwen/Qwen-Image", "file": "qwen_image_fp8_e4m3fn.safetensors"},
    "Qwen-Image (bf16)":     {"repo": "Qwen/Qwen-Image", "file": "qwen_image_bf16.safetensors"},
}


class FikoYTQwenLoader:
    @classmethod
    def INPUT_TYPES(cls):
        return {
            "required": {
                "preset": (list(QWEN_PRESETS.keys()), {"default": "Qwen-Image (fp8)"}),
                "auto_download": ("BOOLEAN", {"default": True}),
                "precision": (["auto", "fp16", "bf16", "fp8_e4m3fn"], {"default": "auto"}),
                "vram_mode": (["auto", "high", "normal", "low"], {"default": "auto"}),
            }
        }

    RETURN_TYPES = ("MODEL", "CLIP", "VAE")
    RETURN_NAMES = ("MODEL", "CLIP", "VAE")
    FUNCTION = "load"
    CATEGORY = "FikoYT/image"

    def load(self, preset, auto_download, precision, vram_mode):
        meta = QWEN_PRESETS[preset]
        ckpt_dir = get_models_dir("checkpoints")
        ckpt_path = os.path.join(ckpt_dir, meta["file"])

        if not os.path.isfile(ckpt_path):
            if auto_download:
                ckpt_path = ensure_model(meta["repo"], meta["file"], "checkpoints")
            else:
                raise FileNotFoundError(
                    f"Qwen checkpoint bulunamadı: {ckpt_path}\n"
                    "auto_download=True yapın veya dosyayı manuel indirin."
                )

        if comfy is None:
            raise RuntimeError("comfy.sd modülü yok — ComfyUI ortamında çalıştırın.")

        emb_dirs = folder_paths.get_folder_paths("embeddings") if folder_paths else []
        out = comfy.sd.load_checkpoint_guess_config(
            ckpt_path,
            output_vae=True,
            output_clip=True,
            embedding_directory=emb_dirs,
        )
        return (out[0], out[1], out[2])


NODE_CLASS_MAPPINGS = {"FikoYTQwenLoader": FikoYTQwenLoader}
NODE_DISPLAY_NAME_MAPPINGS = {"FikoYTQwenLoader": "FikoYT • Qwen-Image Loader"}
