"""FikoYT LTX Suite — MSR/LTX workflow'unu kategorili tek-iş node'larına indirger.

Felsefe: karşında az node, ama her node içinde tüm ince ayarlar widget olarak açık;
değerler ComfyUI gibi korunur. Ham LTX node'ları v3 API (io.ComfyNode) olduğundan,
GPU testi olmadan kör orkestrasyon yerine SADECE basit + kaynağı kesin olan mantık
(LoRA yükleme) burada birebir replike edilir. Sampling/decode çekirdeği fragile →
subgraph olarak paketlenir (ayrı), kör Python wrapper ile değil.
"""
import logging

import comfy.sd
import comfy.utils
import folder_paths

log = logging.getLogger("FikoYT.ltx")

_NONE = "(yok)"
_SLOTS = 4


def _lora_list():
    try:
        return [_NONE] + folder_paths.get_filename_list("loras")
    except Exception:
        return [_NONE]


class FikoYTLTXLoRAStack:
    """Tek node'da N adet LoRA'yı modele uygula (MSR + detailer + custom...).

    Workflow'daki zincirleme LTXICLoRALoaderModelOnly node'larının yerine geçer.
    LoRA yükleme mantığı ComfyUI-LTXVideo/iclora.py ile birebir aynıdır
    (comfy.sd.load_lora_for_models + reference_downscale_factor metadata okuma).
    latent_downscale_factor: MSR LoRA'sının safetensors metadata'sından okunur
    (LTXAddVideoICLoRAGuide.latent_downscale_factor girişine bağlanır).
    """

    @classmethod
    def INPUT_TYPES(cls):
        loras = _lora_list()
        opt = {}
        for i in range(1, _SLOTS + 1):
            opt[f"lora_{i}"] = (loras, {"default": _NONE,
                                        "tooltip": f"LoRA {i} (ör. 1=MSR, 2=detailer). '(yok)' = atla."})
            opt[f"strength_{i}"] = ("FLOAT", {"default": 1.0, "min": -10.0, "max": 10.0, "step": 0.05,
                                              "tooltip": f"LoRA {i} gücü. 0 = atla."})
        return {
            "required": {"model": ("MODEL",)},
            "optional": opt,
        }

    RETURN_TYPES = ("MODEL", "FLOAT")
    RETURN_NAMES = ("model", "latent_downscale_factor")
    FUNCTION = "uygula"
    CATEGORY = "FikoYT/video"

    def uygula(self, model, **kwargs):
        ds = 1.0
        for i in range(1, _SLOTS + 1):
            name = kwargs.get(f"lora_{i}", _NONE)
            strength = float(kwargs.get(f"strength_{i}", 0.0) or 0.0)
            if not name or name == _NONE or strength == 0:
                continue
            path = folder_paths.get_full_path_or_raise("loras", name)
            lora, metadata = comfy.utils.load_torch_file(path, safe_load=True, return_metadata=True)
            try:
                ds = float((metadata or {})["reference_downscale_factor"])   # MSR LoRA taşır
            except (KeyError, ValueError, TypeError):
                pass
            model, _ = comfy.sd.load_lora_for_models(model, None, lora, strength, 0)
            log.info(f"FikoYT LTX LoRA uygulandı: {name} @ {strength}")
        return (model, ds)


NODE_CLASS_MAPPINGS = {"FikoYTLTXLoRAStack": FikoYTLTXLoRAStack}
NODE_DISPLAY_NAME_MAPPINGS = {"FikoYTLTXLoRAStack": "FikoYT 🧩 LTX LoRA Stack (MSR + detailer + ...)"}
