import requests

from .exceptions import *
from requests.exceptions import HTTPError

try:
    from json.decoder import JSONDecodeError
except ImportError:
    JSONDecodeError = ValueError

class Client:
	def __init__(self, configuration):
		self.configuration = configuration

	def get(self, path, payload = {}):
		r = requests.get(self.url(path), params=payload, headers = self.headers())
		return self.handle_response(r)

	def post(self, path, payload):
		r = requests.post(self.url(path), json=payload, headers = self.headers())
		return self.handle_response(r)

	def handle_response(self, r):
		try:
			r.raise_for_status()

			return r.json()
		except HTTPError as err:
			self.handle_http_error(r, err)
		except JSONDecodeError:
			raise DetectLanguageError("Error decoding response JSON")

	def handle_http_error(self, r, err):
		try:
			json = r.json()

			if not 'error' in json:
				raise DetectLanguageError(err)

			raise DetectLanguageError(json['error']['message'])
		except JSONDecodeError:
			raise DetectLanguageError(err)

	def url(self, path):
		return "%s://%s/%s/%s" % (self.protocol(), self.configuration.host, self.configuration.api_version, path)

	def protocol(self):
		return 'https' if self.configuration.secure else 'http'

	def headers(self):
		return {
			'User-Agent': self.configuration.user_agent,
			'Authorization': 'Bearer ' + self.configuration.api_key,
		}