"""FikoYT LTX Loader — LTX-Video-2B Distilled checkpoint + T5 XXL + LTX VAE.

precision (fp16/fp8/bf16), vram_mode → MODEL + CLIP + VAE.
auto_download True ise eksik dosyalar HF'den çekilir.
"""
import os

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

from ..core import ensure_model, get_models_dir


LTX_CHECKPOINTS = {
    "ltx-video-2b-distilled (fp16)": {
        "repo": "Lightricks/LTX-Video",
        "file": "ltx-video-2b-v0.9.5.safetensors",
    },
    "ltx-video-2b-distilled (fp8)": {
        "repo": "Lightricks/LTX-Video",
        "file": "ltx-video-2b-v0.9.5-fp8.safetensors",
    },
}

T5_XXL = {
    "repo": "comfyanonymous/flux_text_encoders",
    "file": "t5xxl_fp16.safetensors",
}
T5_XXL_FP8 = {
    "repo": "comfyanonymous/flux_text_encoders",
    "file": "t5xxl_fp8_e4m3fn.safetensors",
}


class FikoYTLTXLoader:
    """LTX Distilled checkpoint + T5 XXL + VAE yükle."""

    @classmethod
    def INPUT_TYPES(cls):
        return {
            "required": {
                "preset": (list(LTX_CHECKPOINTS.keys()), {"default": "ltx-video-2b-distilled (fp16)"}),
                "precision": (["fp16", "bf16", "fp8_e4m3fn"], {"default": "fp16"}),
                "vram_mode": (["auto", "high", "balanced", "low"], {"default": "auto"}),
                "auto_download": ("BOOLEAN", {"default": True}),
            }
        }

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

    def load(self, preset, precision, vram_mode, auto_download):
        meta = LTX_CHECKPOINTS[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"LTX checkpoint bulunamadı: {ckpt_path}\nauto_download=True yapın."
                )

        # T5 XXL yan dosya — opsiyonel auto-download (precision'a göre)
        if auto_download:
            try:
                t5 = T5_XXL_FP8 if precision == "fp8_e4m3fn" else T5_XXL
                ensure_model(t5["repo"], t5["file"], "clip")
            except Exception:
                pass

        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 = {"FikoYTLTXLoader": FikoYTLTXLoader}
NODE_DISPLAY_NAME_MAPPINGS = {"FikoYTLTXLoader": "FikoYT • LTX Loader"}
