#!/usr/bin/python3
# -*- Mode:Python; indent-tabs-mode:nil; tab-width:4 -*-
#
# Copyright (C) 2015 Canonical Ltd
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License version 3 as
# published by the Free Software Foundation.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

import logging
import io
import sys

from snapcraft.internal.indicators import is_dumb_terminal


class _StdoutFilter(logging.Filter):

    def filter(self, record):
        return record.levelno <= logging.WARNING


class _StderrFilter(logging.Filter):

    def filter(self, record):
        return record.levelno >= logging.ERROR


class _ColoredFormatter(logging.Formatter):
    RESET = '\033[0m'
    LEVEL_COLORS = {
        'INFO': '\033[0;32m',  # Green
        'WARNING': '\033[1;33m',  # Yellow
        'ERROR': '\033[0;31m',  # Dark red
        'CRITICAL': '\033[1;31m',  # Light red
    }

    def format(self, record):
        color = self.LEVEL_COLORS.get(record.levelname, None)
        log_message = super().format(record)
        if color:
            return '{color}{message}{reset}'.format(
                color=color, message=log_message, reset=self.RESET)

        return log_message


def configure(logger_name=None, log_level=None):
    if not log_level:
        log_level = logging.INFO

    if not is_dumb_terminal() and not sys.stdout.line_buffering:
        # Line buffering makes logs easier to handle.
        sys.stdout.flush()
        try:
            sys.stdout = io.TextIOWrapper(
                sys.stdout.detach(), encoding='UTF-8', line_buffering=True)
        except io.UnsupportedOperation:
            # debuilding fails, we will just let it pass as if it were a
            # isatty call
            pass

    stdout_handler = logging.StreamHandler(stream=sys.stdout)
    stdout_handler.addFilter(_StdoutFilter())
    stderr_handler = logging.StreamHandler(stream=sys.stderr)
    stderr_handler.addFilter(_StderrFilter())
    handlers = [stdout_handler, stderr_handler]

    if is_dumb_terminal():
        formatter = logging.Formatter(style='{')
    else:
        formatter = _ColoredFormatter(style='{')
    logger = logging.getLogger(logger_name)
    for handler in handlers:
        handler.setFormatter(formatter)
        logger.addHandler(handler)

    logger.setLevel(log_level)

    # INFO by default for the requests lib as it is too noisy
    if log_level == logging.DEBUG:
        logging.getLogger("requests").setLevel(log_level)
    else:
        logging.getLogger("requests").setLevel(logging.WARNING)
