"""FikoYT Flux Kontext Edit — Kaynak IMAGE + edit_prompt → düzenlenmiş IMAGE.

Flux Kontext checkpoint Flux Loader'dan girer. Bu node sadece edit pipeline'ı:
VAE encode (kaynak) → ReferenceLatent / Kontekst conditioning → KSampler → VAE decode.
"""
try:
    import comfy.samplers
    from nodes import common_ksampler, VAEEncode, VAEDecode, CLIPTextEncode
except ImportError:
    common_ksampler = None
    VAEEncode = None
    VAEDecode = None
    CLIPTextEncode = None

# Flux Kontext için 'ReferenceLatent' node — ComfyUI çekirdeğinde mevcut (Flux Kontext support).
_REF_LATENT = None
try:
    from comfy_extras.nodes_flux import FluxKontextImageScale as _flux_kontext_scale  # type: ignore
except Exception:
    _flux_kontext_scale = None

try:
    from comfy_extras.nodes_edit_model import ReferenceLatent as _ref_latent  # type: ignore
    _REF_LATENT = _ref_latent
except Exception:
    try:
        from nodes_edit_model import ReferenceLatent as _ref_latent  # type: ignore
        _REF_LATENT = _ref_latent
    except Exception:
        _REF_LATENT = None

from ..core import normalize_seed


class FikoYTKontextEdit:
    @classmethod
    def INPUT_TYPES(cls):
        return {
            "required": {
                "model": ("MODEL",),
                "clip": ("CLIP",),
                "vae": ("VAE",),
                "source_image": ("IMAGE",),
                "edit_prompt": ("STRING", {
                    "multiline": True,
                    "default": "change the background to a snowy mountain",
                }),
                "negative_prompt": ("STRING", {"multiline": True, "default": ""}),
                "steps":   ("INT",   {"default": 20, "min": 1, "max": 200}),
                "cfg":     ("FLOAT", {"default": 2.5, "min": 0.0, "max": 30.0, "step": 0.1}),
                "denoise": ("FLOAT", {"default": 1.0, "min": 0.0, "max": 1.0, "step": 0.01}),
                "sampler_name": (comfy.samplers.KSampler.SAMPLERS, {"default": "euler"}),
                "scheduler":    (comfy.samplers.KSampler.SCHEDULERS, {"default": "simple"}),
                "seed": ("INT", {"default": -1, "min": -1, "max": 0xFFFFFFFF}),
            }
        }

    RETURN_TYPES = ("IMAGE",)
    RETURN_NAMES = ("edited_image",)
    FUNCTION = "edit"
    CATEGORY = "FikoYT/image"

    def edit(self, model, clip, vae, source_image, edit_prompt, negative_prompt,
             steps, cfg, denoise, 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)

        # 1. Kaynak imajı Kontext-ölçekli boyutlara çek (opsiyonel)
        scaled_image = source_image
        if _flux_kontext_scale is not None:
            try:
                scaled_image = _flux_kontext_scale().scale(source_image)[0]
            except Exception:
                scaled_image = source_image

        # 2. Conditioning'leri encode et
        positive = CLIPTextEncode().encode(clip, edit_prompt)[0]
        negative = CLIPTextEncode().encode(clip, negative_prompt)[0]

        # 3. Kaynak latent
        source_latent = VAEEncode().encode(vae, scaled_image)[0]

        # 4. ReferenceLatent ile positive'e kaynak inject et (Flux Kontext yöntemi)
        if _REF_LATENT is not None:
            try:
                positive = _REF_LATENT().append(positive, source_latent)[0]
            except Exception:
                pass

        # 5. KSampler — denoise=1.0 tam edit, daha düşükle yumuşak edit
        sampled = common_ksampler(
            model, seed, steps, cfg, sampler_name, scheduler,
            positive, negative, source_latent, denoise=denoise,
        )[0]

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


NODE_CLASS_MAPPINGS = {"FikoYTKontextEdit": FikoYTKontextEdit}
NODE_DISPLAY_NAME_MAPPINGS = {"FikoYTKontextEdit": "FikoYT • Flux Kontext Edit"}
