# -*- coding: utf-8 -*-
'''
Library for interacting with Mattermost Incoming Webhooks
:configuration: This module can be used by specifying the name of a
    configuration profile in the minion config, minion pillar, or master
    config.
    For example:
    .. code-block:: yaml
        mattermost:
          hook: 3tdgo8restnxiykdx88wqtxryr
          api_url: https://example.com
'''
from __future__ import absolute_import, unicode_literals

import logging
# Import 3rd-party libs
# pylint: disable=import-error,no-name-in-module,redefined-builtin
from salt.ext.six.moves.urllib.parse import urljoin as _urljoin
import salt.ext.six.moves.http_client
from salt.version import __version__
# pylint: enable=import-error,no-name-in-module
import salt.utils.http

from salt.ext import six

log = logging.getLogger(__name__)


def query(hook=None,
          api_url=None,
          data=None):
    '''
    Mattermost object method function to construct and execute on the API URL.
    :param api_url:     The Mattermost API URL
    :param hook:        The Mattermost hook.
    :param data:        The data to be sent for POST method.
    :return:            The json response from the API call or False.
    '''
    method = 'POST'

    ret = {'message': '',
           'res': True}

    base_url = _urljoin(api_url, '/hooks/')
    url = _urljoin(base_url, six.text_type(hook))

    result = salt.utils.http.query(url,
                                   method,
                                   data=data,
                                   decode=True,
                                   status=True)

    if result.get('status', None) == salt.ext.six.moves.http_client.OK:
        ret['message'] = 'Message posted {0} correctly'.format(data)
        return ret
    elif result.get('status', None) == salt.ext.six.moves.http_client.NO_CONTENT:
        return True
    else:
        log.debug(url)
        log.debug(data)
        log.debug(result)
        if 'dict' in result:
            _result = result['dict']
            if 'error' in _result:
                ret['message'] = result['error']
                ret['res'] = False
                return ret
            ret['message'] = 'Message not posted'
        else:
            ret['message'] = 'invalid_auth'
            ret['res'] = False
    return ret
