"""FikoYT Prompt Düzenle — üretimi DURDURUP komple prompt'u düzenletir, Devam'da sürdürür.

Mantık (ComfyUI Image-Chooser deseni): node çalışınca üretilen komple prompt'u frontend'e
gönderir ve worker thread'i bir Event'te BLOKLAR. Kullanıcı node'daki kutuda düzenleyip
'▶ Devam'a basınca /fikoyt/prompt_duzenle route'u Event'i serbest bırakır; node düzenlenmiş
metni döndürür ve graf kaldığı yerden üretmeye devam eder. ComfyUI iptaline duyarlı (loop+timeout).
"""
import threading

try:
    import comfy.model_management as mm
except Exception:
    mm = None

# node_id(str) -> {"event": threading.Event, "text": str}
_WAIT = {}


class FikoYTPromptDuzenle:
    @classmethod
    def INPUT_TYPES(cls):
        return {
            "required": {
                "prompt": ("STRING", {"forceInput": True,
                                      "tooltip": "Gelen komple prompt. Üretim burada durur, düzenleyip Devam'a bas."}),
            },
            "optional": {
                "aktif": ("BOOLEAN", {"default": True,
                                      "tooltip": "Açık: durdur + düzenlet. Kapalı: hiç durdurmadan aynen geçir."}),
            },
            "hidden": {"unique_id": "UNIQUE_ID"},
        }

    RETURN_TYPES = ("STRING",)
    RETURN_NAMES = ("prompt",)
    FUNCTION = "bekle"
    CATEGORY = "FikoYT/video"

    @classmethod
    def IS_CHANGED(cls, **kwargs):
        return float("nan")          # her çalıştırmada dursun (cache'e takılmasın)

    def bekle(self, prompt, aktif=True, unique_id=None):
        if not aktif:
            return (prompt,)
        try:
            from server import PromptServer
        except Exception:
            return (prompt,)         # server yoksa düzenlemeden geç

        nid = str(unique_id)
        ev = threading.Event()
        _WAIT[nid] = {"event": ev, "text": prompt}
        PromptServer.instance.send_sync("fikoyt-prompt-duzenle", {"id": nid, "text": prompt})

        # Devam'a basana kadar bekle; bu arada ComfyUI iptalini dinle
        while not ev.wait(timeout=0.25):
            if mm is not None:
                mm.throw_exception_if_processing_interrupted()
        return (_WAIT.pop(nid, {}).get("text", prompt),)


# --- /fikoyt/prompt_duzenle route (Devam butonu buraya POST eder) ---
try:
    from server import PromptServer
    from aiohttp import web

    @PromptServer.instance.routes.post("/fikoyt/prompt_duzenle")
    async def _fikoyt_prompt_duzenle(request):
        try:
            d = await request.json()
        except Exception:
            d = {}
        nid = str(d.get("id"))
        w = _WAIT.get(nid)
        if w:
            w["text"] = d.get("text", w["text"])
            w["event"].set()
            return web.json_response({"ok": True})
        return web.json_response({"ok": False, "error": "bekleyen node yok"})
except Exception:
    pass


NODE_CLASS_MAPPINGS = {"FikoYTPromptDuzenle": FikoYTPromptDuzenle}
NODE_DISPLAY_NAME_MAPPINGS = {"FikoYTPromptDuzenle": "FikoYT ⏸ Prompt Düzenle (DUR + Devam)"}
