# coding: utf-8
import os
import sys
import logging
import sqlparse
from pygments import highlight
from pygments.lexers import SqlLexer
from pygments.formatters import Terminal256Formatter


class SqlFormatter(logging.Formatter):
    def __init__(self, *args, **kwargs):
        self.highlight = kwargs.pop('highlight', True)
        self.style = kwargs.pop('style', 'default')

        self.parse = kwargs.pop('parse', True)
        self.reindent = kwargs.pop('reindent', True)
        self.keyword_case = kwargs.pop('keyword_case', 'upper')

        self._lexer = SqlLexer()
        self._formatter = Terminal256Formatter(style=self.style)

        super(SqlFormatter, self).__init__(*args, **kwargs)

    def format(self, record):
        super(SqlFormatter, self).format(record)

        msg = record.sql

        if self.parse:
            msg = sqlparse.format(msg, reindent=self.reindent, keyword_case=self.keyword_case)

        if self.highlight:
            msg = highlight(msg, self._lexer, self._formatter)

        return msg


class LogDb:
    def __init__(self, name='django.db.backends', handler=None, propagate=None, **kwargs):
        self.name = name
        self.propagate = propagate

        self.handler = handler or logging.StreamHandler(sys.stdout)
        self.formatter = SqlFormatter(**kwargs)

        self.running = False

    def __call__(self, **options):
        # Toggle
        if not self.running:
            self.enable()
            self.running = True
        else:
            self.disable()
            self.running = False

        return self.running

    def enable(self):
        logger = logging.getLogger(self.name)

        self.handler.setFormatter(self.formatter)
        logger.addHandler(self.handler)
        logger.setLevel(logging.DEBUG)

        self.propagate = logger.propagate
        logger.propagate = False

    def disable(self):
        logger = logging.getLogger(self.name)

        logger.removeHandler(self.handler)
        logger.setLevel(logging.NOTSET)

        logger.propagate = self.propagate
        self.propagate = None

if os.name == 'nt':
    logdb = LogDb(highlight=False)
else:
    logdb = LogDb()