"""BGM 라이브러리 및 라이선스 검증 모듈.

IDS Phase 5 — 모션 카드뉴스 (HTML→MP4)
- CC0 / YouTube Audio Library Free / Public Domain 라이선스만 허용
- 파일 존재 여부 확인 (다운로드 미지원)
"""
from __future__ import annotations

from pathlib import Path
from typing import Optional

_ALLOWED_LICENSES: frozenset[str] = frozenset({
    "CC0",
    "YouTube Audio Library Free",
    "Public Domain",
})

BGM_LIBRARY: dict[str, dict] = {  # type: ignore[type-arg]
    "chill_lofi_01": {
        "name": "Chill Lo-Fi Beat 01",
        "source": "YouTube Audio Library",
        "license": "YouTube Audio Library Free",
        "url": "https://placeholder.youtube-audio-library.example/chill_lofi_01",
        "filename": "chill_lofi_01.mp3",
        "duration_sec": 120,
        "bpm": 85,
        "tags": ("lofi", "chill", "ambient"),
    },
    "gentle_piano_cc0": {
        "name": "Gentle Piano CC0",
        "source": "ccmixter.org",
        "license": "CC0",
        "url": "https://placeholder.ccmixter.example/gentle_piano_cc0",
        "filename": "gentle_piano_cc0.mp3",
        "duration_sec": 180,
        "bpm": 72,
        "tags": ("piano", "calm", "instrumental"),
    },
    "upbeat_pop_cc0": {
        "name": "Upbeat Pop CC0",
        "source": "freemusicarchive.org",
        "license": "CC0",
        "url": "https://placeholder.freemusicarchive.example/upbeat_pop_cc0",
        "filename": "upbeat_pop_cc0.mp3",
        "duration_sec": 150,
        "bpm": 128,
        "tags": ("pop", "upbeat", "energetic"),
    },
    "nature_ambience_pd": {
        "name": "Nature Ambience",
        "source": "freesound.org",
        "license": "Public Domain",
        "url": "https://placeholder.freesound.example/nature_ambience_pd",
        "filename": "nature_ambience_pd.mp3",
        "duration_sec": 300,
        "bpm": None,
        "tags": ("nature", "ambient", "background"),
    },
}

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


def validate_license(track_id: str) -> bool:
    """트랙 라이선스가 허용된 라이선스인지 검증합니다.

    Args:
        track_id: BGM_LIBRARY에 등록된 트랙 ID

    Returns:
        True (라이선스가 허용됨)

    Raises:
        ValueError: 트랙 ID가 없거나 라이선스가 허용되지 않는 경우
    """
    if track_id not in BGM_LIBRARY:
        raise ValueError(
            f"알 수 없는 트랙 ID: '{track_id}'. "
            f"사용 가능한 트랙: {sorted(BGM_LIBRARY.keys())}"
        )

    track = BGM_LIBRARY[track_id]
    license_val = track.get("license", "")
    if license_val not in _ALLOWED_LICENSES:
        raise ValueError(
            f"허용되지 않은 라이선스: '{license_val}'. "
            f"허용 라이선스: {sorted(_ALLOWED_LICENSES)}"
        )
    return True


def get_bgm_path(track_id: str, library_dir: Path) -> Optional[Path]:
    """트랙 ID에 해당하는 BGM 파일 경로를 반환합니다.

    Args:
        track_id: BGM_LIBRARY에 등록된 트랙 ID
        library_dir: BGM 파일이 저장된 디렉토리

    Returns:
        파일이 존재하면 Path, 없으면 None

    Raises:
        ValueError: 트랙 ID가 없거나 라이선스가 허용되지 않는 경우
    """
    validate_license(track_id)
    track = BGM_LIBRARY[track_id]
    filename = track.get("filename", "")
    if not filename:
        return None

    candidate = Path(library_dir) / filename
    if candidate.exists():
        return candidate
    return None
