# -*- coding: utf-8 mode: python -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8

__all__ = ('ConsoleOutput', 'NullOutput')

from ulib.base.base import make_prop
from ulib.base.output import get_colored, eerror, ewarn, enote, eimportant, eattention, einfo, eecho, eecho_, edebug, etitle, estep, estep_, ebegin, edot, eend

class NullOutput(object):
    def __init__(self):
        super(NullOutput, self).__init__()
        self._printed = ''

    # interface vers les méthodes de ulib.base.output
    def eerror(self, msg=None, flush=None, show_tb=False): pass
    def ewarn(self, msg, flush=None): pass
    def enote(self, msg, flush=None): pass
    def eimportant(self, msg, flush=None): pass
    def eattention(self, msg, flush=None): pass
    def einfo(self, msg, flush=None): pass
    def eecho(self, msg, flush=None): pass
    def eecho_(self, msg, flush=None): pass
    def edebug(self, msg, flush=None): pass
    def etitle(self, title, ends=True, flush=None): pass
    def estep(self, msg, flush=None): pass
    def estep_(self, msg, flush=None): pass
    def ebegin(self, title, func_or_result=None, *args, **kw): pass
    def edot(self, msg=None, func_or_result=None, *args, **kw): pass
    def eend(self, func_or_result=None, *args, **kw): pass

    _deferred, deferred = make_prop('_deferred', False)[:2]
    _printed = None
    def get_printed(self):
        printed = self._printed
        self._printed = ''
        return printed
    printed = property(get_printed)

    # suivi des fichiers mise à jour
    def notfound(self, name):
        """Indiquer que le fichier name n'a pas été trouvé.

        Ne nécessite pas que la méthode beginf() soit appelée d'abord.
        """
    def beginf(self, name):
        """Marquer le début du traitement du fichier nommé name"""
    def folded(self):
        """Indiquer que le fichier spécifié avec beginf() a été plié"""
    def needed(self, name):
        """Indiquer que le fichier name est requis dans la liste des fichier à
        inclure pour le fichier spécifié avec beginf(), mais que ce fichier n'a
        pas été inclus
        """
    def unfolded(self):
        """Indiquer que le fichier spécifié avec beginf() a été déplié"""
    def ignored(self, reason=None):
        """Indiquer qu'aucune action n'a été effectuée pour le fichier spécifié
        avec beginf(). cela signifie par exemple que le fichier était invalide.
        """
    def endf(self):
        """Marquer la fin du traitement du fichier"""

class ConsoleOutput(NullOutput):
    def eerror(self, msg=None, flush=None, show_tb=False): eerror(msg, flush, show_tb)
    def ewarn(self, msg, flush=None): ewarn(msg, flush)
    def enote(self, msg, flush=None): enote(msg, flush)
    def eimportant(self, msg, flush=None): eimportant(msg, flush)
    def eattention(self, msg, flush=None): eattention(msg, flush)
    def einfo(self, msg, flush=None): einfo(msg, flush)
    def eecho(self, msg, flush=None): eecho(msg, flush)
    def eecho_(self, msg, flush=None): eecho_(msg, flush)
    def edebug(self, msg, flush=None): edebug(msg, flush)
    def etitle(self, title, func_or_result=None, *args, **kw):
        etitle(title, func_or_result, *args, **kw)
    def estep(self, msg, flush=None): estep(msg, flush)
    def estep_(self, msg, flush=None): estep_(msg, flush)
    def ebegin(self, title, func_or_result=None, *args, **kw):
        ebegin(title, func_or_result, *args, **kw)
    def edot(self, msg=None, func_or_result=None, *args, **kw):
        edot(msg, func_or_result, *args, **kw)
    def eend(self, func_or_result=None, *args, **kw):
        eend(func_or_result, *args, **kw)

    def __print(self, s):
        if self._deferred:
            self._printed += s
            self._printed += '\n'
        else:
            eecho(s)
    def __print_(self, s):
        if self._deferred: self._printed += s
        else: eecho_(s)

    _prefix = '' # le préfixe des valeur à afficher
    _level = 0 # niveau de fichier affiché
    _name = None
    _nl = True # sommes-nous sur une nouvelle-ligne?

    def _ensurenl(self):
        if not self._nl: self.__print('')
        self._nl = True
    def _printn(self, msg):
        self._ensurenl()
        self.__print_('%s%s' % (self._prefix, msg))
        self._nl = False
    def _print(self, msg=''):
        if self._nl: self.__print('%s%s' % (self._prefix, msg))
        else: self.__print(msg)
        self._nl = True

    def notfound(self, name):
        self._ensurenl()
        self._print(get_colored("%s: not found" % name, 'y,@'))
    def beginf(self, name):
        self._name = name
        self._printn("%s: " % name)
        self._level += 1
        self._prefix = self._level * "  "
    def folded(self): self._print("F")
    def needed(self, name):
        self._ensurenl()
        self._print(get_colored("%s is required" % name, 'r,@'))
    def unfolded(self): self._print("U")
    def ignored(self, reason=None):
        if reason is None: reason = "I"
        self._print(get_colored(reason, 'y,@'))
    def endf(self):
        self._ensurenl()
        if self._level > 0:
            self._level -= 1
            self._prefix = self._level * "  "
