"""FikoYT Character Studio — gelişmiş karakter profil + tutarlı üretim yardımcıları.

- FikoYTCharacterProfile: tüm profil alanlarından zengin prompt öneki derler.
- FikoYTCharacterScene: profil + sahne tanımı → tek sahne promptu (film tutarlılığı).
- FikoYTMultiAnglePrompts: tek karakter için çoklu açı prompt listesi (LoRA dataset).
"""

_YOK = "yok"

CINSIYET = [_YOK, "kadın", "erkek", "genç kız", "genç erkek", "androjen", "non-binary"]
YAS = [_YOK, "çocuk", "genç (18-25)", "yetişkin (25-40)", "orta yaş", "yaşlı"]
VUCUT = [_YOK, "ince", "atletik", "kaslı", "dolgun", "balık etli", "zayıf", "iri"]
STIL = [_YOK, "photorealistic", "cinematic", "anime", "oil painting",
        "3d render", "comic book", "fantasy art", "cyberpunk", "watercolor"]
ETNIK = [_YOK, "turkish", "middle eastern", "european", "east asian",
         "south asian", "african", "latina", "nordic", "mixed"]

_CINS_EN = {
    "kadın": "1woman, female", "erkek": "1man, male",
    "genç kız": "young woman", "genç erkek": "young man",
    "androjen": "androgynous person", "non-binary": "non-binary person",
}
_YAS_EN = {
    "çocuk": "child", "genç (18-25)": "young adult, early twenties",
    "yetişkin (25-40)": "adult, thirties", "orta yaş": "middle-aged",
    "yaşlı": "elderly, old",
}

ACILAR = [
    ("front", "front view, looking at camera"),
    ("side_left", "left side profile view"),
    ("side_right", "right side profile view"),
    ("three_quarter", "three quarter view, slight angle"),
    ("back", "back view, from behind"),
    ("top", "high angle from above"),
    ("low", "low angle from below"),
    ("closeup", "extreme close-up of face"),
    ("full_body", "full body shot, head to toe"),
    ("cowboy", "cowboy shot, waist up"),
]


def _profil_prompt(cinsiyet, yas, sac, goz, vucut, etnik, stil, betim, tetik):
    parca = []
    if tetik.strip():
        parca.append(tetik.strip())
    if yas != _YOK:
        parca.append(_YAS_EN.get(yas, yas))
    if etnik != _YOK:
        parca.append(etnik)
    if cinsiyet != _YOK:
        parca.append(_CINS_EN.get(cinsiyet, cinsiyet))
    if sac.strip():
        parca.append(f"{sac.strip()} hair")
    if goz.strip():
        parca.append(f"{goz.strip()} eyes")
    if vucut != _YOK:
        parca.append(f"{vucut} build")
    if betim.strip():
        parca.append(betim.strip())
    if stil != _YOK:
        parca.append(stil)
    return ", ".join(parca)


_PROFIL_INPUTS = {
    "name": ("STRING", {"default": "character_01"}),
    "cinsiyet": (CINSIYET, {"default": "kadın"}),
    "yas": (YAS, {"default": "yetişkin (25-40)"}),
    "etnik": (ETNIK,),
    "sac_rengi": ("STRING", {"default": ""}),
    "goz_rengi": ("STRING", {"default": ""}),
    "vucut": (VUCUT,),
    "stil": (STIL, {"default": "photorealistic"}),
    "betimleme": ("STRING", {"default": "", "multiline": True}),
    "tetik_kelime": ("STRING", {"default": ""}),
}


class FikoYTCharacterProfile:
    """Karakter profil alanlarından zengin İngilizce prompt öneki + isim."""

    @classmethod
    def INPUT_TYPES(cls):
        return {"required": dict(_PROFIL_INPUTS)}

    RETURN_TYPES = ("STRING", "STRING")
    RETURN_NAMES = ("profile_prompt", "name")
    FUNCTION = "derle"
    CATEGORY = "FikoYT/character"

    def derle(self, name, cinsiyet, yas, etnik, sac_rengi, goz_rengi,
              vucut, stil, betimleme, tetik_kelime):
        return (_profil_prompt(cinsiyet, yas, sac_rengi, goz_rengi, vucut,
                               etnik, stil, betimleme, tetik_kelime), name)


class FikoYTCharacterScene:
    """Profil promptu + sahne tanımı → tek tutarlı sahne promptu (film için)."""

    @classmethod
    def INPUT_TYPES(cls):
        return {
            "required": {
                "profile_prompt": ("STRING", {"forceInput": True}),
                "sahne": ("STRING", {"default": "", "multiline": True}),
                "kamera": ([a[0] for a in ACILAR], {"default": "three_quarter"}),
                "ortam_stili": ("STRING", {"default": "cinematic lighting, detailed background"}),
            }
        }

    RETURN_TYPES = ("STRING",)
    RETURN_NAMES = ("scene_prompt",)
    FUNCTION = "derle"
    CATEGORY = "FikoYT/character"

    def derle(self, profile_prompt, sahne, kamera, ortam_stili):
        aci = dict(ACILAR).get(kamera, "")
        parca = [profile_prompt.strip()]
        if sahne.strip():
            parca.append(sahne.strip())
        if aci:
            parca.append(aci)
        if ortam_stili.strip():
            parca.append(ortam_stili.strip())
        return (", ".join(p for p in parca if p),)


class FikoYTMultiAnglePrompts:
    """Bir karakter için çoklu açı prompt listesi (LoRA dataset / referans seti)."""

    @classmethod
    def INPUT_TYPES(cls):
        return {
            "required": {
                "profile_prompt": ("STRING", {"forceInput": True}),
                "adet": ("INT", {"default": 6, "min": 1, "max": 10}),
                "stil_ek": ("STRING", {"default": "studio lighting, plain background, sharp focus"}),
            }
        }

    RETURN_TYPES = ("STRING", "INT")
    RETURN_NAMES = ("prompts_newline", "count")
    FUNCTION = "uret"
    CATEGORY = "FikoYT/character"
    OUTPUT_NODE = True

    def uret(self, profile_prompt, adet, stil_ek):
        satirlar = []
        for i in range(min(adet, len(ACILAR))):
            _, aci = ACILAR[i]
            parts = [profile_prompt.strip(), aci]
            if stil_ek.strip():
                parts.append(stil_ek.strip())
            satirlar.append(", ".join(parts))
        metin = "\n".join(satirlar)
        return {"ui": {"text": [metin]}, "result": (metin, len(satirlar))}


NODE_CLASS_MAPPINGS = {
    "FikoYTCharacterProfile": FikoYTCharacterProfile,
    "FikoYTCharacterScene": FikoYTCharacterScene,
    "FikoYTMultiAnglePrompts": FikoYTMultiAnglePrompts,
}
NODE_DISPLAY_NAME_MAPPINGS = {
    "FikoYTCharacterProfile": "FikoYT 👤 Character Profile",
    "FikoYTCharacterScene": "FikoYT 🎬 Character Scene Prompt",
    "FikoYTMultiAnglePrompts": "FikoYT 🔄 Multi-Angle Prompts",
}
