﻿from __future__ import annotations

from urllib.parse import quote, urljoin

import httpx


class GggClient:
    def __init__(self, base_url: str = "https://www.gggmusic.com/", timeout: float = 20.0):
        self.base_url = base_url
        self.timeout = timeout
        self._client = httpx.Client(
            timeout=timeout,
            follow_redirects=True,
            trust_env=False,
            headers={"User-Agent": "Mozilla/5.0"},
        )

    def fetch_text(self, url: str | None = None) -> str:
        target = url or self.base_url
        response = self._client.get(target)
        response.raise_for_status()
        return response.text

    def search_url(self, keyword: str, *, range_: int = 1) -> str:
        encoded = quote(keyword.strip(), safe="")
        return urljoin(self.base_url, f"search-{encoded}-{range_}.htm")

    def search(self, keyword: str, *, range_: int = 1) -> str:
        return self.fetch_text(self.search_url(keyword, range_=range_))

    def post_json(self, url: str, payload: object, *, referer: str | None = None) -> object:
        headers = {"Content-Type": "application/json"}
        if referer:
            headers["Referer"] = referer
        response = self._client.post(url, json=payload, headers=headers)
        response.raise_for_status()
        return response.json()

    def absolute_url(self, href: str) -> str:
        return urljoin(self.base_url, href)

    def close(self) -> None:
        self._client.close()

    def __enter__(self) -> "GggClient":
        return self

    def __exit__(self, *args: object) -> None:
        self.close()
