#!/usr/bin/env python
# -*- encoding: utf-8 -*-

from __future__ import absolute_import
import logging
import os
import logging.config
from urllib import unquote_plus

LEVELS = {
    'DEBUG': logging.DEBUG,
    'INFO': logging.INFO,
    'WARNING': logging.WARNING,
    'WARN': logging.WARNING,
    'ERROR': logging.ERROR,
    'CRITICAL': logging.CRITICAL,
}


DEFAULT_CONF = {
    'version': 1,
    'disable_existing_loggers': False,
    'loggers': {
        '': {
            'level': 'WARNING',
            'handlers': ['console', 'debug_file_handler']
        },
        'strephit': {
            'level': 'INFO',
        },
    },
    'formatters': {
        'strephit': {
            'format': '%(asctime)s [%(levelname)s] %(module)s.%(funcName)s #%(lineno)d - %(message)s'
        }
    },
    'handlers': {
        'console': {
            'formatter': 'strephit',
            'class': 'logging.StreamHandler',
            'level': 'DEBUG'
        },
        'debug_file_handler': {
            'formatter': 'strephit',
            'level': 'DEBUG',
            'filename': 'debug.log',
            'mode': 'w',
            'class': 'logging.FileHandler',
            'encoding': 'utf8'
        }
    }
}


def setup():
    conf_path = os.path.abspath(os.path.join('dev', 'logging.ini'))
    if os.path.exists(conf_path):
        logging.config.fileConfig(conf_path, DEFAULT_CONF,
                                  disable_existing_loggers=False)
    else:
        logging.config.dictConfig(DEFAULT_CONF)


def setLogLevel(module, level):
    """ Sets the log level used to log messages from the given module """
    if level in LEVELS:
        module = '' if module == 'root' else module
        logging.getLogger(module).setLevel(level)


def log_request_data(http_response, logger):
    """
    Send a debug log message with basic information of the HTTP request that was sent for the given HTTP response.

    :param requests.models.Response http_response: HTTP response object
    """
    sent_request = {
        'method': http_response.request.method,
        'url': http_response.request.url,
        'headers': http_response.request.headers,
        'decoded_body': unquote_plus(repr(http_response.request.body))
    }
    logger.debug("Request sent: %s" % sent_request)
    return 0