from enum import Enum
from loguru import logger
import os
import requests


class BearerManager:
    class Endpoints(Enum):
        RANDOM = '/random_token'

    def __init__(self, demb_capi_auth: str, base_address: str):

        self.base_address = base_address
        self.demb_capi_auth = demb_capi_auth
        self.session = requests.Session()

    def get_random_bearer(self) -> str:
        """Gets bearer token from capi.demb.design (companion-api project)

        :return: bearer token as str
        """

        bearer_request: requests.Response = self._request(self.Endpoints.RANDOM)

        try:
            bearer: str = bearer_request.json()['access_token']

        except Exception as e:
            logger.exception(f'Unable to parse capi.demb.design answer\nrequested: {bearer_request.url!r}\n'
                             f'code: {bearer_request.status_code!r}\nresponse: {bearer_request.content!r}', exc_info=e)
            raise BearerManagerException(e)

        return bearer

    def _request(self, _endpoint: Endpoints) -> requests.Response:
        endpoint = self.base_address + _endpoint.value
        return self.session.get(url=endpoint, headers={'auth': self.demb_capi_auth})


class BearerManagerException(Exception):
    def __init__(self, parent_exception: Exception):
        self.parent_exception = parent_exception


bearer_manager = BearerManager(os.environ['DEMB_CAPI_AUTH'], 'https://capi.demb.design')