from __future__ import absolute_import, print_function

from requests.exceptions import RequestException

from sentry import http
from sentry.utils import json

from .constants import BASE_DOMAIN


class PassbookApiError(Exception):
    def __init__(self, message='', status=0):
        super(PassbookApiError, self).__init__(message)
        self.status = status


class PassbookClient(object):
    def __init__(self, client_id, client_secret):
        self.client_id = client_id
        self.client_secret = client_secret
        self.http = http.build_session()

    def _request(self, path, access_token):
        params = {
            'client_id': self.client_id,
            'client_secret': self.client_secret,
        }

        headers = {
            'Authorization': 'Bearer {0}'.format(access_token),
        }

        try:
            req = self.http.get('https://{0}/{1}'.format(BASE_DOMAIN, path.lstrip('/')),
                params=params,
                headers=headers,
            )
        except RequestException as e:
            raise PassbookApiError(unicode(e), status=getattr(e, 'status_code', 0))
        if req.status_code < 200 or req.status_code >= 300:
            raise PassbookApiError(req.content, status=req.status_code)
        return json.loads(req.content)

    def get_user(self, access_token):
        return self._request('/api/v1/openid/', access_token)