"""FikoYT Audio Trim — tensor slice + linear fade in/out."""
import torch


class FikoYTAudioTrim:
    @classmethod
    def INPUT_TYPES(cls):
        return {
            "required": {
                "audio": ("AUDIO",),
                "start_sec": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 3600.0, "step": 0.01}),
                "end_sec": ("FLOAT", {"default": -1.0, "min": -1.0, "max": 3600.0, "step": 0.01}),
                "fade_in_sec": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 10.0, "step": 0.01}),
                "fade_out_sec": ("FLOAT", {"default": 0.0, "min": 0.0, "max": 10.0, "step": 0.01}),
            }
        }

    RETURN_TYPES = ("AUDIO",)
    RETURN_NAMES = ("audio",)
    FUNCTION = "trim"
    CATEGORY = "FikoYT/audio"

    def trim(self, audio, start_sec, end_sec, fade_in_sec, fade_out_sec):
        wav = audio["waveform"]
        sr = int(audio["sample_rate"])

        was_batched = (wav.dim() == 3)
        if not was_batched:
            wav = wav.unsqueeze(0) if wav.dim() == 2 else wav.unsqueeze(0).unsqueeze(0)

        total = wav.shape[-1]
        s_idx = max(0, int(start_sec * sr))
        e_idx = total if end_sec < 0 else min(total, int(end_sec * sr))
        if e_idx <= s_idx:
            raise ValueError(f"end_sec ({end_sec}) start_sec ({start_sec})'ten büyük olmalı")

        out = wav[..., s_idx:e_idx].clone().float()
        n = out.shape[-1]

        if fade_in_sec > 0:
            fi_n = min(n, int(fade_in_sec * sr))
            if fi_n > 1:
                ramp = torch.linspace(0.0, 1.0, fi_n, device=out.device)
                out[..., :fi_n] *= ramp

        if fade_out_sec > 0:
            fo_n = min(n, int(fade_out_sec * sr))
            if fo_n > 1:
                ramp = torch.linspace(1.0, 0.0, fo_n, device=out.device)
                out[..., -fo_n:] *= ramp

        if not was_batched:
            out = out.squeeze(0)

        if out.dim() == 2:
            out = out.unsqueeze(0)

        print(f"[FikoYT Trim] {s_idx/sr:.2f}s → {e_idx/sr:.2f}s ({n/sr:.2f}s)")
        return ({"waveform": out, "sample_rate": sr},)


NODE_CLASS_MAPPINGS = {"FikoYTAudioTrim": FikoYTAudioTrim}
NODE_DISPLAY_NAME_MAPPINGS = {"FikoYTAudioTrim": "FikoYT • Audio Trim + Fade"}
