from json import JSONDecodeError

from requests import Session
from requests.exceptions import RequestException, Timeout, TooManyRedirects

from lib.utils.general.utils import USER_AGENT_HEADER
from lib.utils.kodi.settings import get_int_setting
from lib.utils.kodi.utils import kodilog


class Stremio:
    def __init__(self, authKey=None):
        self.authKey = authKey
        self.session = Session()
        self.session.headers.update(USER_AGENT_HEADER)

    def _request(self, method, url, data=None):
        try:
            if method == "GET":
                resp = self.session.get(url, timeout=get_int_setting("stremio_timeout"))
            elif method == "POST":
                resp = self.session.post(url, json=data, timeout=get_int_setting("stremio_timeout"))
            else:
                raise ValueError(f"Unsupported HTTP method: {method}")

            if resp.status_code != 200:
                kodilog(
                    f"Status code {resp.status_code} received for URL: {url}. Response: {resp.text}"
                )
                resp.raise_for_status()

            try:
                return resp.json()
            except JSONDecodeError:
                kodilog(f"Failed to decode JSON response for URL: {url}. Response: {resp.text}")
                raise
        except Timeout:
            kodilog(f"Request timed out for URL: {url}")
            raise
        except TooManyRedirects:
            kodilog(f"Too many redirects encountered for URL: {url}")
            raise
        except RequestException as e:
            kodilog(f"Failed to fetch data from {url}: {e}")
            raise

    def _get(self, url):
        return self._request("GET", url)

    def _post(self, url, data):
        return self._request("POST", url, data)

    def login(self, email, password):
        """Login to Stremio account."""
        data = {
            "authKey": self.authKey,
            "email": email,
            "password": password,
        }

        res = self._post("https://api.strem.io/api/login", data)
        self.authKey = res.get("result", {}).get("authKey", None)

    def dataExport(self):
        """Export user data."""
        assert self.authKey, "Login first"
        data = {"authKey": self.authKey}
        res = self._post("https://api.strem.io/api/dataExport", data)
        exportId = res.get("result", {}).get("exportId", None)

        dataExport = self._get(f"https://api.strem.io/data-export/{exportId}/export.json")
        return dataExport

    def get_my_addons(self):
        """Get user addons."""
        response = self.dataExport()
        return response.get("addons", {}).get("addons", [])
