from typing import Any, Dict, Optional

from lib.api.debrid.base import ProviderException
from lib.utils.general.utils import supported_video_extensions
from lib.utils.kodi.utils import translation

PACKED_RELEASE_FALLBACK_TEMPLATE = (
    "{provider} cannot directly play packed releases (.rar/.zip). "
    "Choose a source with video files instead."
)


def get_packed_release_message(provider_name: str) -> str:
    template = translation(30918)
    if not isinstance(template, str) or not template:
        template = PACKED_RELEASE_FALLBACK_TEMPLATE
    return template.format(provider=provider_name)


def get_file_name(file_data: Optional[Dict[str, Any]]) -> str:
    if not file_data:
        return ""

    return str(
        file_data.get("path")
        or file_data.get("filename")
        or file_data.get("short_name")
        or file_data.get("name")
        or file_data.get("n")
        or ""
    )


def is_direct_playable_file(filename: Optional[str]) -> bool:
    if not filename:
        return False

    lowered = filename.lower()
    return any(lowered.endswith(ext) for ext in supported_video_extensions())


def ensure_direct_playable_file(filename: Optional[str]) -> None:
    if not filename:
        return

    if is_direct_playable_file(filename):
        return

    raise ProviderException(get_packed_release_message("This provider"))


def ensure_direct_playable_file_for_provider(filename: Optional[str], provider_name: str) -> None:
    if not filename:
        return

    if is_direct_playable_file(filename):
        return

    raise ProviderException(get_packed_release_message(provider_name))
