"""ffmpeg 모션 효과 필터 표현식 모듈.

IDS Phase 5 — 모션 카드뉴스 (HTML→MP4)
5가지 효과: fade / slide / zoom / dissolve / sequence
"""
from __future__ import annotations

EFFECTS: dict[str, str] = {
    "fade": "[{i}:v]fade=t=in:st=0:d={fade_d},fade=t=out:st={fade_out_st}:d={fade_d}[v{i}]",
    "slide": "[{i}:v]crop={w}:{h}:0:0,overlay=x='if(lte(t,{duration}),t/{duration}*{w}-{w},0)':y=0[v{i}]",
    "zoom": "[{i}:v]scale=iw*{zoom_scale}:ih*{zoom_scale},crop={w}:{h}:(iw-{w})/2:(ih-{h})/2,zoompan=z='min(zoom+0.001,1.15)':d={total_frames}:s={w}x{h}[v{i}]",
    "dissolve": "[{i}:v][{j}:v]xfade=transition=dissolve:duration={xfade_d}:offset={xfade_offset}[v{ij}]",
    "sequence": "CONCAT_DEMUXER",
}

__annotations__: dict[str, str] = {"EFFECTS": "dict[str, str]"}

_VALID_EFFECTS: set[str] = set(EFFECTS.keys())


def get_effect_filter(effect: str, fps: int, duration: float) -> str:
    """효과 이름에 해당하는 ffmpeg 필터 템플릿 문자열을 반환합니다.

    Args:
        effect: 효과 이름 ('fade', 'slide', 'zoom', 'dissolve', 'sequence')
        fps: 초당 프레임 수 (미사용, 서명 호환성용)
        duration: 프레임당 지속 시간(초) (미사용, 서명 호환성용)

    Returns:
        ffmpeg 필터 템플릿 문자열

    Raises:
        ValueError: 알 수 없는 효과 이름인 경우
    """
    _ = fps, duration  # suppress unused-parameter warnings
    if effect not in _VALID_EFFECTS:
        raise ValueError(f"알 수 없는 효과: '{effect}'. 지원 효과: {sorted(_VALID_EFFECTS)}")
    return EFFECTS[effect]
