"""FikoYT Character Unpack — FIKOYT_CHARACTER → (IMAGE ref, prompt, neg, lora_stack, name)."""
import os

try:
    import numpy as np
    import torch
    from PIL import Image
except ImportError:
    np = None
    torch = None
    Image = None

from ..core import FIKOYT_CHARACTER, FIKOYT_LORA_STACK


def _empty_image():
    if torch is None:
        return None
    return torch.zeros((1, 64, 64, 3), dtype=torch.float32)


def _load_image_tensor(path: str):
    if not path or not os.path.isfile(path) or Image is None or np is None or torch is None:
        return _empty_image()
    try:
        img = Image.open(path).convert("RGB")
        arr = np.array(img).astype(np.float32) / 255.0
        return torch.from_numpy(arr)[None,]
    except Exception:
        return _empty_image()


class FikoYTCharacterUnpack:
    @classmethod
    def INPUT_TYPES(cls):
        return {
            "required": {
                "character": (FIKOYT_CHARACTER,),
            }
        }

    RETURN_TYPES = ("IMAGE", "STRING", "STRING", FIKOYT_LORA_STACK, "STRING")
    RETURN_NAMES = ("ref_image", "base_prompt", "base_neg", "lora_stack", "name")
    FUNCTION = "unpack"
    CATEGORY = "FikoYT/character"

    def unpack(self, character):
        if not isinstance(character, dict):
            return (_empty_image(), "", "", [], "")
        ref_path = character.get("ref_image_path") or character.get("face_emb_path") or ""
        img = _load_image_tensor(ref_path)
        prompt = character.get("base_prompt", "") or ""
        neg = character.get("base_neg", "") or ""
        stack = character.get("lora_stack") or []
        if not stack:
            # legacy: lora_paths sadece isim listesi ise minimal stack üret
            for n in character.get("lora_paths", []) or []:
                stack.append({"name": n, "strength_model": 1.0, "strength_clip": 1.0})
        name = character.get("name", "") or ""
        return (img, prompt, neg, list(stack), name)


NODE_CLASS_MAPPINGS = {"FikoYTCharacterUnpack": FikoYTCharacterUnpack}
NODE_DISPLAY_NAME_MAPPINGS = {"FikoYTCharacterUnpack": "FikoYT • Character Unpack"}
