from __future__ import annotations

from moviebot.crawlers.base import BaseCrawler
from moviebot.crawlers.common import normalize_api_movie
from moviebot.http import HttpClient
from moviebot.models import NormalizedMovie


class OPhimCrawler(BaseCrawler):
    source_name = "ophim"

    def __init__(self, config: dict, http: HttpClient):
        self.config = config
        self.http = http

    def list_slugs(self, max_pages: int) -> list[str]:
        url_template = self.config.get("list_url", "https://ophim1.com/danh-sach/phim-moi-cap-nhat?page={page}")
        slugs: list[str] = []
        for page in range(1, max_pages + 1):
            data = self.http.get_json(url_template.format(page=page))
            for item in data.get("items", []):
                slug = item.get("slug")
                if slug:
                    slugs.append(slug)
            total_pages = int(data.get("pagination", {}).get("totalPages") or page)
            if page >= total_pages:
                break
        return slugs

    def fetch_movie(self, slug: str) -> NormalizedMovie:
        url = self.config.get("detail_url", "https://ophim1.com/phim/{slug}").format(slug=slug)
        data = self.http.get_json(url)
        if not data.get("status", False):
            raise ValueError(f"OPhim returned invalid status for {slug}")
        return normalize_api_movie(self.source_name, slug, data)

