"""FikoYT Style Transfer — IMAGE → IMAGE, IPAdapter veya StyleAlign method ile.

Yöntem "ipadapter": ComfyUI_IPAdapter_plus üzerinden style ref → MODEL'i style'a yönlendir
                    → kaynak imajı img2img'le yeni style'da render et.
Yöntem "stylealign": MODEL attention'a kaynak/style align inject et (SD1.5/SDXL deneysel).
"""
try:
    import comfy.samplers
    from nodes import common_ksampler, VAEEncode, VAEDecode, CLIPTextEncode
except ImportError:
    common_ksampler = None
    VAEEncode = None
    VAEDecode = None
    CLIPTextEncode = None

_IPADAPTER_APPLY = None
try:
    from custom_nodes.ComfyUI_IPAdapter_plus import IPAdapterPlus as _ipa_mod  # type: ignore
    _IPADAPTER_APPLY = getattr(_ipa_mod, "IPAdapterAdvanced", None) or getattr(_ipa_mod, "IPAdapter", None)
except Exception:
    pass

from ..core import normalize_seed


class FikoYTStyleTransfer:
    @classmethod
    def INPUT_TYPES(cls):
        return {
            "required": {
                "source_image": ("IMAGE",),
                "style_image":  ("IMAGE",),
                "model": ("MODEL",),
                "clip":  ("CLIP",),
                "vae":   ("VAE",),
                "prompt": ("STRING", {"multiline": True, "default": "high quality, detailed"}),
                "negative_prompt": ("STRING", {"multiline": True, "default": "low quality, blurry"}),
                "method": (["ipadapter", "stylealign"], {"default": "ipadapter"}),
                "strength": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 2.0, "step": 0.05}),
                "denoise":  ("FLOAT", {"default": 0.75, "min": 0.0, "max": 1.0, "step": 0.01}),
                "steps":    ("INT",   {"default": 20, "min": 1, "max": 200}),
                "cfg":      ("FLOAT", {"default": 7.0, "min": 0.0, "max": 30.0, "step": 0.1}),
                "sampler_name": (comfy.samplers.KSampler.SAMPLERS, {"default": "euler"}),
                "scheduler":    (comfy.samplers.KSampler.SCHEDULERS, {"default": "normal"}),
                "seed": ("INT", {"default": -1, "min": -1, "max": 0xFFFFFFFF}),
            }
        }

    RETURN_TYPES = ("IMAGE",)
    RETURN_NAMES = ("styled_image",)
    FUNCTION = "transfer"
    CATEGORY = "FikoYT/image"

    def transfer(self, source_image, style_image, model, clip, vae,
                 prompt, negative_prompt, method, strength, denoise,
                 steps, cfg, sampler_name, scheduler, seed):
        if common_ksampler is None:
            raise RuntimeError("ComfyUI 'nodes' modülü yok — ComfyUI ortamında çalıştırın.")

        seed = normalize_seed(seed)
        styled_model = model

        if method == "ipadapter":
            if _IPADAPTER_APPLY is None:
                raise RuntimeError(
                    "ipadapter method seçildi ama ComfyUI_IPAdapter_plus yüklü değil. "
                    "https://github.com/cubiq/ComfyUI_IPAdapter_plus yükleyin."
                )
            try:
                inst = _IPADAPTER_APPLY()
                if hasattr(inst, "apply_ipadapter"):
                    res = inst.apply_ipadapter(
                        model=model, ipadapter=None, image=style_image,
                        weight=strength, weight_type="linear",
                        start_at=0.0, end_at=1.0, attn_mask=None,
                    )
                    styled_model = res[0] if isinstance(res, tuple) else res
            except Exception as e:
                raise RuntimeError(f"IPAdapter style injection başarısız: {e}")
        # method == "stylealign" → MODEL'e dokunmadan KSampler'a girer (deneysel; ileride extension).

        positive = CLIPTextEncode().encode(clip, prompt)[0]
        negative = CLIPTextEncode().encode(clip, negative_prompt)[0]
        latent = VAEEncode().encode(vae, source_image)[0]

        sampled = common_ksampler(
            styled_model, seed, steps, cfg, sampler_name, scheduler,
            positive, negative, latent, denoise=denoise,
        )[0]

        out_image = VAEDecode().decode(vae, sampled)[0]
        return (out_image,)


NODE_CLASS_MAPPINGS = {"FikoYTStyleTransfer": FikoYTStyleTransfer}
NODE_DISPLAY_NAME_MAPPINGS = {"FikoYTStyleTransfer": "FikoYT • Style Transfer"}
