from __future__ import annotations

from pathlib import Path
from urllib.parse import urljoin

from .http import HttpClient
from .models import NormalizedMovie
from .playlist.cleaner import PlaylistCleaner
from .utils import movie_folder_name, safe_filename, source_folder_name, to_db_path


class PlaylistWriteResult:
    def __init__(self, file_path: str, db_path: str):
        self.file_path = file_path
        self.db_path = db_path


class PlaylistWriter:
    def __init__(self, root_dir: str, http: HttpClient, cleaner: PlaylistCleaner, db_mount: str = "/m3u8"):
        self.root_dir = Path(root_dir)
        self.http = http
        self.cleaner = cleaner
        self.db_mount = db_mount

    def write(self, movie: NormalizedMovie, filename: str, m3u8_url: str, access_key: str) -> PlaylistWriteResult:
        content, base_url = self._fetch_variant_or_master(m3u8_url)
        cleaned = self.cleaner.clean(content, base_url)
        folder = self.root_dir / source_folder_name(movie.source) / movie_folder_name(movie.title, movie.year, movie.tmdb_id)
        folder.mkdir(parents=True, exist_ok=True)
        path = folder / f"{safe_filename(access_key)}.m3u8"
        path.write_text(cleaned, encoding="utf-8")
        return PlaylistWriteResult(str(path), to_db_path(path, self.root_dir, self.db_mount))

    def _fetch_variant_or_master(self, m3u8_url: str) -> tuple[str, str]:
        response = self.http.get(m3u8_url)
        master = response.text
        base_url = urljoin(m3u8_url, ".")
        lines = master.splitlines()
        for index, line in enumerate(lines):
            if line.startswith("#EXT-X-STREAM-INF") and index + 1 < len(lines):
                variant = lines[index + 1].strip()
                if variant and not variant.startswith("#"):
                    variant_url = urljoin(base_url, variant)
                    return self.http.get(variant_url).text, urljoin(variant_url, ".")
        return master, base_url
