from __future__ import annotations

import logging
import re
import sqlite3
from http.server import SimpleHTTPRequestHandler, ThreadingHTTPServer
from pathlib import Path
from urllib.parse import unquote


def run_playlist_server(root_dir: str, host: str = "0.0.0.0", port: int = 8000, db_path: str | None = None) -> None:
    root = Path(root_dir).resolve()
    logging.info("Serving playlists from %s at http://%s:%s", root, host, port)

    class Handler(SimpleHTTPRequestHandler):
        access_key_pattern = re.compile(r"^/([^/]+)\.m3u8$")

        def __init__(self, *args, **kwargs):
            super().__init__(*args, directory=str(root), **kwargs)

        def do_GET(self):
            match = self.access_key_pattern.match(unquote(self.path.split("?", 1)[0]))
            if match and db_path:
                resolved = self._resolve_access_key(match.group(1))
                if resolved:
                    self.path = resolved
            return super().do_GET()

        def _resolve_access_key(self, access_key: str) -> str | None:
            try:
                conn = sqlite3.connect(db_path)
                row = conn.execute(
                    "SELECT cleaned_m3u8_path FROM episodes WHERE access_key = ? AND crawl_status = 'success'",
                    (access_key,),
                ).fetchone()
                conn.close()
            except sqlite3.Error as exc:
                logging.warning("Access-key lookup failed key=%s error=%s", access_key, exc)
                return None
            if not row or not row[0]:
                return None
            return row[0]

    ThreadingHTTPServer((host, port), Handler).serve_forever()
