import requests


class Request(object):
    def __init__(self, url, headers=None):
        self.headers = {
            'Accept': 'application/json'
        }
        if headers:
            self.headers.update(headers)

        self.BASE_URL = url

    def get(self, endpoint: str, headers=None, **kwargs):

        r = requests.get(
            self.BASE_URL + endpoint,
            headers={**headers, **self.headers} if headers else self.headers,
            **kwargs
        )
        r.raise_for_status()
        return r.json()

    def post(self, endpoint: str, headers=None, **kwargs):

        r = requests.post(
            self.BASE_URL + endpoint,
            headers={**headers, **self.headers} if headers else self.headers,
            **kwargs
        )
        r.raise_for_status()

        return r.json()

    def put(self, endpoint: str, headers=None, **kwargs):

        r = requests.put(
            self.BASE_URL + endpoint,
            headers={**headers, **self.headers} if headers else self.headers,
            **kwargs
        )
        r.raise_for_status()
        return r.json()

    def delete(self, endpoint: str, headers=None, **kwargs):

        r = requests.delete(
            self.BASE_URL + endpoint,
            headers={**headers, **self.headers} if headers else self.headers,
            **kwargs
        )
        r.raise_for_status()

        return r.json()


class AdminRequest(Request):
    def __init__(self, hostname, admin_username, admin_password,
                 **kwargs):
        self.username = admin_username
        url = f'{admin_username}:{admin_password}@{hostname}/'
        super().__init__('http://' + url)

    def __str__(self):
        return f'admin user: {self.username}'


class TokenRequest(Request):
    def __init__(self, hostname, token: str, **kwargs):
        self.token = token

        super().__init__(f'http://{hostname}/', {
            'Authorization': 'Bearer ' + token
        })

    def __str__(self):
        return f'token {self.token}'