import base64

import six

from .. import utils


class ConfigApiMixin(object):
    @utils.minimum_version('1.30')
    def create_config(self, name, data, labels=None):
        """
            Create a config

            Args:
                name (string): Name of the config
                data (bytes): Config data to be stored
                labels (dict): A mapping of labels to assign to the config

            Returns (dict): ID of the newly created config
        """
        if not isinstance(data, bytes):
            data = data.encode('utf-8')

        data = base64.b64encode(data)
        if six.PY3:
            data = data.decode('ascii')
        body = {
            'Data': data,
            'Name': name,
            'Labels': labels
        }

        url = self._url('/configs/create')
        return self._result(
            self._post_json(url, data=body), True
        )

    @utils.minimum_version('1.30')
    @utils.check_resource('id')
    def inspect_config(self, id):
        """
            Retrieve config metadata

            Args:
                id (string): Full ID of the config to remove

            Returns (dict): A dictionary of metadata

            Raises:
                :py:class:`docker.errors.NotFound`
                    if no config with that ID exists
        """
        url = self._url('/configs/{0}', id)
        return self._result(self._get(url), True)

    @utils.minimum_version('1.30')
    @utils.check_resource('id')
    def remove_config(self, id):
        """
            Remove a config

            Args:
                id (string): Full ID of the config to remove

            Returns (boolean): True if successful

            Raises:
                :py:class:`docker.errors.NotFound`
                    if no config with that ID exists
        """
        url = self._url('/configs/{0}', id)
        res = self._delete(url)
        self._raise_for_status(res)
        return True

    @utils.minimum_version('1.30')
    def configs(self, filters=None):
        """
            List configs

            Args:
                filters (dict): A map of filters to process on the configs
                list. Available filters: ``names``

            Returns (list): A list of configs
        """
        url = self._url('/configs')
        params = {}
        if filters:
            params['filters'] = utils.convert_filters(filters)
        return self._result(self._get(url, params=params), True)
