"""Define a client to interact with the city and county of Denver."""
from aiohttp import ClientSession, client_exceptions

from .errors import RequestError
from .trash import Trash


class Client(object):  # pylint: disable=too-few-public-methods
    """Define the client."""

    def __init__(self, websession: ClientSession) -> None:
        """Initialize."""
        self._websession = websession

        self.trash = Trash(self.request, websession.loop)

    async def request(
            self,
            method: str,
            url: str,
            *,
            kind: str = 'json',
            headers: dict = None,
            params: dict = None,
            json: dict = None) -> dict:
        """Make a request."""
        async with self._websession.request(method, url, headers=headers,
                                            params=params, json=json) as resp:
            try:
                resp.raise_for_status()
                if kind == 'text':
                    data = await resp.text()
                else:
                    data = await resp.json(content_type=None)
                return data
            except client_exceptions.ClientError as err:
                raise RequestError(
                    'Error requesting data from {0}: {1}'.format(
                        url, err)) from None
