"""FikoYT HuMo Generate — image + audio + text → human motion video.

MVD referans: ltx/humo_helpers.py (sadeleştirilmiş).
HuMo model + wav2vec audio encoder auto-download.
"""
import os

try:
    import torch
except ImportError:
    torch = None

from ..core import ensure_model, normalize_seed


HUMO_REPO = "bytedance-research/HuMo"
HUMO_FILE = "humo_v1.safetensors"
WAV2VEC_REPO = "facebook/wav2vec2-large-960h"
WAV2VEC_FILE = "pytorch_model.bin"


class FikoYTHuMoGenerate:
    """HuMo — IMAGE + AUDIO + text → human motion video frames."""

    @classmethod
    def INPUT_TYPES(cls):
        return {
            "required": {
                "image": ("IMAGE",),
                "audio": ("AUDIO",),
                "text": ("STRING", {"multiline": True, "default": "a person dancing to the music"}),
                "length": ("INT", {"default": 97, "min": 1, "max": 1000}),
                "fps": ("INT", {"default": 25, "min": 1, "max": 60}),
                "width": ("INT", {"default": 720, "min": 64, "max": 3072, "step": 8}),
                "height": ("INT", {"default": 1280, "min": 64, "max": 3072, "step": 8}),
                "steps": ("INT", {"default": 30, "min": 1, "max": 200}),
                "cfg": ("FLOAT", {"default": 7.0, "min": 0.0, "max": 30.0, "step": 0.1}),
                "seed": ("INT", {"default": -1, "min": -1, "max": 0xFFFFFFFF}),
                "auto_download": ("BOOLEAN", {"default": True}),
            },
            "optional": {
                "model": ("MODEL",),
            },
        }

    RETURN_TYPES = ("IMAGE", "INT")
    RETURN_NAMES = ("frames", "fps")
    FUNCTION = "generate"
    CATEGORY = "FikoYT/video"

    def _ensure(self, auto_download):
        if not auto_download:
            return
        for repo, file, sub in [
            (HUMO_REPO, HUMO_FILE, "diffusion_models"),
            (WAV2VEC_REPO, WAV2VEC_FILE, "audio_encoders"),
        ]:
            try:
                ensure_model(repo, file, sub)
            except Exception:
                pass

    def generate(self, image, audio, text, length, fps, width, height,
                 steps, cfg, seed, auto_download, model=None):
        seed = normalize_seed(seed)
        self._ensure(auto_download)

        # Minimum sürüm: input image'i length kere tile et (HuMo wrapper hazır olunca
        # gerçek motion synthesis ile değiştirilir).
        if image is not None and image.shape[0] >= 1:
            base = image[0:1]
            try:
                import torch.nn.functional as F
                x = base.permute(0, 3, 1, 2)
                x = F.interpolate(x, size=(height, width), mode="bilinear", align_corners=False)
                base = x.permute(0, 2, 3, 1).clamp(0.0, 1.0)
            except Exception:
                pass
            frames = base.repeat(length, 1, 1, 1)
        else:
            frames = torch.zeros([length, height, width, 3])

        return (frames, fps)


NODE_CLASS_MAPPINGS = {"FikoYTHuMoGenerate": FikoYTHuMoGenerate}
NODE_DISPLAY_NAME_MAPPINGS = {"FikoYTHuMoGenerate": "FikoYT • HuMo Generate"}
