import os
import re
import uuid
from flask import current_app


def allowed_file(filename, extensions):
    return (
        "." in filename
        and filename.rsplit(".", 1)[1].lower() in extensions
    )


def save_upload(file_storage, subfolder, kind="image"):
    """Save an uploaded FileStorage into static/uploads/<subfolder>/ and
    return the relative path (to store in the DB / use in url_for).

    kind: "image" (default) or "video" — controls which extensions are
    accepted, so image-only fields can't be pointed at a video file.
    """
    if not file_storage or file_storage.filename == "":
        return None

    extensions = (
        current_app.config["ALLOWED_VIDEO_EXTENSIONS"]
        if kind == "video"
        else current_app.config["ALLOWED_EXTENSIONS"]
    )
    if not allowed_file(file_storage.filename, extensions):
        return None

    ext = file_storage.filename.rsplit(".", 1)[1].lower()
    filename = f"{uuid.uuid4().hex}.{ext}"

    folder = os.path.join(current_app.config["UPLOAD_FOLDER"], subfolder)
    os.makedirs(folder, exist_ok=True)
    file_storage.save(os.path.join(folder, filename))

    return f"uploads/{subfolder}/{filename}"


_YOUTUBE_RE = re.compile(
    r"(?:youtu\.be/|youtube\.com/(?:watch\?v=|embed/|shorts/))([A-Za-z0-9_-]{6,})"
)
_VIMEO_RE = re.compile(r"vimeo\.com/(?:video/)?(\d+)")


def parse_video_embed(url):
    """Given any video URL (YouTube, Vimeo, or a direct .mp4/.webm link),
    return a dict describing how to embed it. Used as a Jinja filter so
    templates can render background/feature video from a pasted link."""
    if not url:
        return None
    url = url.strip()

    yt = _YOUTUBE_RE.search(url)
    if yt:
        vid = yt.group(1)
        return {
            "kind": "youtube",
            "watch_url": f"https://www.youtube.com/watch?v={vid}",
            "embed_src": (
                f"https://www.youtube.com/embed/{vid}"
                f"?autoplay=1&mute=1&loop=1&controls=0&playlist={vid}"
                f"&modestbranding=1&rel=0&playsinline=1"
            ),
            "embed_src_controls": f"https://www.youtube.com/embed/{vid}",
        }

    vm = _VIMEO_RE.search(url)
    if vm:
        vid = vm.group(1)
        return {
            "kind": "vimeo",
            "watch_url": f"https://vimeo.com/{vid}",
            "embed_src": f"https://player.vimeo.com/video/{vid}?autoplay=1&muted=1&loop=1&background=1",
            "embed_src_controls": f"https://player.vimeo.com/video/{vid}",
        }

    return {"kind": "direct", "watch_url": url, "embed_src": url, "embed_src_controls": url}
