import requests
from tqdm import tqdm

API_VERSION = "v2"
HEADERS = {
    'User-Agent': 'mc-get-testing'
}


def download(file_url: str, file_size: int, path: str):
    resp = requests.get(file_url, stream=True, headers=HEADERS)
    with open(path, 'wb') as file:
        for data in tqdm(resp.iter_content(), total=file_size, unit_scale=True, unit="byte"):
            file.write(data)


def __method(method: str, api_version: str = API_VERSION):
    api_url = "https://api.modrinth.com"

    def request(**args):
        sub_method = ""
        if "project" in args:
            sub_method = "/" + args.pop("project")
        elif "version" in args:
            sub_method = "/" + args.pop("version")
        print(f"{api_url}/{api_version}{method}{sub_method}")
        resp = requests.get(f"{api_url}/{api_version}{method}{sub_method}", params=args, headers=HEADERS)
        print(resp.headers.get("X-Ratelimit-Remaining", -1))
        match resp.status_code:
            case 200:
                print("200: OK")
                if type(resp.json()) == list:
                    return [type(method, (object,), obj) for obj in resp.json()]
                return type(method, (object,), resp.json())
            case 400:
                # Invalid request
                print("400: ERROR")
            case 401:
                # No authorization
                print("401: ERROR")
            case 404:
                '''
                The requested project was not found or
                no authorization to see this project
                '''
                print("404: ERROR")
        resp.raise_for_status()
    return request


test = __method("", "")
search = __method("/search")
project = __method("/project")
version = __method("/version")
versions = __method("/versions")