from __future__ import annotations

from pathlib import Path
from urllib.parse import quote

from .models import NormalizedMovie
from .utils import episode_code, library_name, movie_folder_name, safe_filename, to_db_path


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


class StrmWriter:
    def __init__(self, root_dir: str, playlist_public_url: str, db_mount: str = "/strm"):
        self.root_dir = Path(root_dir)
        self.playlist_public_url = playlist_public_url.rstrip("/")
        self.db_mount = db_mount

    def write(self, movie: NormalizedMovie, filename: str, playlist_db_path: str, access_key: str, season: int, episode: int) -> StrmWriteResult:
        folder = self.root_dir / library_name(movie.media_type) / movie_folder_name(movie.title, movie.year, movie.tmdb_id)
        if movie.media_type == "tv":
            folder = folder / f"Season {season:02}"
            strm_name = f"{episode_code(season, episode)} - {safe_filename(filename)}.strm"
        else:
            strm_name = f"{safe_filename(filename)}.strm"
        folder.mkdir(parents=True, exist_ok=True)
        path = folder / strm_name
        playlist_url = f"{self.playlist_public_url}/{quote(access_key)}.m3u8"
        path.write_text(playlist_url, encoding="utf-8")
        return StrmWriteResult(str(path), to_db_path(path, self.root_dir, self.db_mount))
