"""FikoYT NSFW Advanced — yetişkin üretim için gelişmiş yardımcı node'lar.

- FikoYTNSFWQualityChain: NSFW prompt'a anatomi/detay kalite etiketleri + LoRA
  önerisi + güvenli negatif ekler (çocuk koruması ZORUNLU).
- FikoYTNSFWLevelGate: nsfw_level eşiğiyle akışı kontrol eder (allow flag).
- FikoYTNSFWRegionPrompt: bölge bazlı NSFW prompt (vücut bölgesi → detaylı prompt).
"""

# Çocuk koruması — HER ZAMAN eklenir, kaldırılamaz.
KORUMA = ("(child:1.5), (kid:1.5), (teenager:1.4), underage, loli, shota, "
          "young child, infant, toddler, minor")
TEMEL_NEG = ("deformed, bad anatomy, extra limbs, fused fingers, extra fingers, "
             "missing limbs, mutated hands, malformed, disfigured, watermark, "
             "text, signature, lowres, blurry, jpeg artifacts")

ANATOMI_KALITE = {
    "yok": "",
    "dusuk": "detailed body",
    "orta": "detailed anatomy, realistic skin, natural proportions",
    "yuksek": ("ultra detailed anatomy, perfect anatomy, realistic skin texture, "
               "subsurface scattering, detailed body, natural proportions, "
               "anatomically correct"),
    "maksimum": ("masterpiece anatomy, hyper detailed skin, pores, realistic "
                 "subsurface scattering, perfect proportions, anatomically perfect, "
                 "photorealistic body, 8k detail, professional nude photography"),
}

BOLGE_PROMPT = {
    "yok": "",
    "gogus": "detailed breasts, natural shape",
    "kalca": "detailed buttocks, round shape",
    "bel": "slim waist, toned midriff",
    "bacaklar": "long legs, smooth thighs",
    "yuz": "beautiful detailed face, seductive expression",
    "tum_vucut": "full body, head to toe, complete figure",
}

LORA_ONERI = {
    "yok": "",
    "flux_nsfw": "NSFW_master_Flux.safetensors",
    "pony_realism": "use a Pony/SDXL realism NSFW lora",
    "detail_skin": "add a skin detailer lora",
}


class FikoYTNSFWQualityChain:
    """NSFW prompt → kalite-zenginleştirilmiş prompt + güvenli negatif + lora ipucu."""

    @classmethod
    def INPUT_TYPES(cls):
        return {
            "required": {
                "prompt": ("STRING", {"default": "", "multiline": True, "forceInput": False}),
                "anatomi_kalite": (list(ANATOMI_KALITE.keys()), {"default": "yuksek"}),
                "lora_oneri": (list(LORA_ONERI.keys()), {"default": "flux_nsfw"}),
                "guvenli_koruma": ("BOOLEAN", {"default": True}),
            },
            "optional": {
                "negatif": ("STRING", {"default": "", "multiline": True}),
            },
        }

    RETURN_TYPES = ("STRING", "STRING", "STRING")
    RETURN_NAMES = ("prompt", "negative", "lora_hint")
    FUNCTION = "zincir"
    CATEGORY = "FikoYT/nsfw"

    def zincir(self, prompt, anatomi_kalite, lora_oneri, guvenli_koruma, negatif=""):
        p = prompt.strip()
        kalite = ANATOMI_KALITE.get(anatomi_kalite, "")
        if kalite:
            p = f"{p}, {kalite}" if p else kalite
        neg = TEMEL_NEG
        if guvenli_koruma:
            neg = f"{KORUMA}, {neg}"
        if negatif.strip():
            neg = f"{neg}, {negatif.strip()}"
        return (p, neg, LORA_ONERI.get(lora_oneri, ""))


class FikoYTNSFWLevelGate:
    """nsfw_level (0-5) eşiğiyle içerik kapısı — allow flag + temizlenmiş prompt."""

    @classmethod
    def INPUT_TYPES(cls):
        return {
            "required": {
                "prompt": ("STRING", {"default": "", "multiline": True}),
                "nsfw_level": ("INT", {"default": 0, "min": 0, "max": 5}),
                "izin_esigi": ("INT", {"default": 0, "min": 0, "max": 5}),
            }
        }

    RETURN_TYPES = ("STRING", "BOOLEAN", "INT")
    RETURN_NAMES = ("prompt", "allowed", "level")
    FUNCTION = "kapi"
    CATEGORY = "FikoYT/nsfw"

    def kapi(self, prompt, nsfw_level, izin_esigi):
        izin = nsfw_level <= izin_esigi or izin_esigi >= 5
        return (prompt, bool(izin), nsfw_level)


class FikoYTNSFWRegionPrompt:
    """Vücut bölgesi seçimlerinden birleşik detaylı NSFW bölge promptu."""

    @classmethod
    def INPUT_TYPES(cls):
        bolgeler = list(BOLGE_PROMPT.keys())
        return {
            "required": {
                "bolge1": (bolgeler, {"default": "gogus"}),
                "bolge2": (bolgeler,),
                "bolge3": (bolgeler,),
                "yogunluk": ("FLOAT", {"default": 1.1, "min": 0.5, "max": 1.6, "step": 0.05}),
            },
            "optional": {
                "base_prompt": ("STRING", {"default": "", "multiline": True}),
            },
        }

    RETURN_TYPES = ("STRING",)
    RETURN_NAMES = ("prompt",)
    FUNCTION = "bolge"
    CATEGORY = "FikoYT/nsfw"

    def bolge(self, bolge1, bolge2, bolge3, yogunluk, base_prompt=""):
        parca = []
        if base_prompt.strip():
            parca.append(base_prompt.strip())
        for b in (bolge1, bolge2, bolge3):
            v = BOLGE_PROMPT.get(b, "")
            if v:
                # Ağırlık vurgusu (Flux/SDXL uyumlu (...:w) sözdizimi)
                parca.append(f"({v}:{yogunluk:.2f})" if yogunluk != 1.0 else v)
        return (", ".join(parca),)


NODE_CLASS_MAPPINGS = {
    "FikoYTNSFWQualityChain": FikoYTNSFWQualityChain,
    "FikoYTNSFWLevelGate": FikoYTNSFWLevelGate,
    "FikoYTNSFWRegionPrompt": FikoYTNSFWRegionPrompt,
}
NODE_DISPLAY_NAME_MAPPINGS = {
    "FikoYTNSFWQualityChain": "FikoYT 🔞 NSFW Quality Chain",
    "FikoYTNSFWLevelGate": "FikoYT 🔞 NSFW Level Gate",
    "FikoYTNSFWRegionPrompt": "FikoYT 🔞 NSFW Region Prompt",
}
