import os
from typing import Iterable, Optional


WORKDIR_ROOT = os.path.abspath("workdir")


def ensure_parent_dir(path: str) -> None:
    parent = os.path.dirname(path)
    if parent and not os.path.exists(parent):
        os.makedirs(parent, exist_ok=True)


def get_video_path(user_id: int, db_file_id: str | int, video_name: str, ext: str) -> str:
    _id = str(db_file_id)
    return os.path.abspath(
        os.path.join(WORKDIR_ROOT, str(user_id), _id, f"{video_name}.{ext}")
    )


def find_video_file(
    user_id: int,
    db_file_id: str | int,
    video_name: str,
    ext: str,
    processed_suffixes: Optional[Iterable[str]] = None,
) -> Optional[str]:
    """
    Ищет обработанный или исходный видеофайл в рабочей директории пользователя.
    """
    base_path = get_video_path(user_id, db_file_id, video_name, ext)
    dir_path = os.path.dirname(base_path)
    if not os.path.exists(dir_path):
        return None

    if processed_suffixes is None:
        processed_suffixes = ("_edited.mp4", "_edited.mov", f"_edited.{ext}")

    for file in os.listdir(dir_path):
        if any(file.endswith(sfx) for sfx in processed_suffixes):
            path = os.path.join(dir_path, file)
            if os.path.exists(path):
                return path

    for path in [
        os.path.join(dir_path, f"{video_name}_edited.{ext}"),
        base_path,
    ]:
        if os.path.exists(path):
            return path
    return None


def build_public_video_url(video_path: str, server_video_base: str) -> str:
    """Строит публичный URL видео: SERVER_VIDEO_BASE + относительный путь от workdir."""
    workdir_abs = os.path.abspath(WORKDIR_ROOT)
    rel = os.path.relpath(os.path.abspath(video_path), workdir_abs)
    if not server_video_base.endswith("/"):
        server_video_base += "/"
    return server_video_base + rel.replace("\\", "/")

