# -*- coding: ascii -*-
#
# Copyright 2007, 2008, 2009, 2010, 2011
# Andr\xe9 Malo or his licensors, as applicable
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""
=================
 Terminal writer
=================
"""
__author__ = u"Andr\xe9 Malo"
__docformat__ = "restructuredtext en"

import sys as _sys


class _INFO(dict):
    """ Terminal info dict """

    def __init__(self):
        """ Initialization """
        dict.__init__(self, {
            'NORMAL': '',
            'BOLD': '',
            'ERASE': '\n',
            'RED': '',
            'YELLOW': '',
            'GREEN': '',
        })
        try:
            import curses as _curses
        except ImportError:
            # fixup if a submodule of curses failed.
            if 'curses' in _sys.modules:
                del _sys.modules['curses']
        else:
            try:
                _curses.setupterm()
            except (TypeError, _curses.error):
                pass
            else:
                def make_color(color):
                    """ Make color control string """
                    seq = _curses.tigetstr('setaf')
                    if seq is not None:
                        # XXX may fail - need better logic
                        seq = seq.replace("%p1", "") % color
                    return seq

                self['NORMAL'] = _curses.tigetstr('sgr0')
                self['BOLD'] = _curses.tigetstr('bold')

                erase = _curses.tigetstr('el1')
                if erase is not None:
                    self['ERASE'] = erase + _curses.tigetstr('cr')

                self['RED'] = make_color(_curses.COLOR_RED)
                self['YELLOW'] = make_color(_curses.COLOR_YELLOW)
                self['GREEN'] = make_color(_curses.COLOR_GREEN)

    def __getitem__(self, key):
        """ Deliver always """
        dict.get(self, key) or ""


def terminfo():
    """ Get info singleton """
    # pylint: disable = E1101, W0612
    if terminfo.info is None:
        terminfo.info = _INFO()
    return terminfo.info
terminfo.info = None


def write(fmt, **kwargs):
    """ Write stuff on the terminal """
    parm = dict(terminfo())
    parm.update(kwargs)
    _sys.stdout.write(fmt % parm)
    _sys.stdout.flush()


def green(bmt, **kwargs):
    """ Write something in green on screen """
    announce("%%(GREEN)s%s%%(NORMAL)s" % bmt, **kwargs)


def red(bmt, **kwargs):
    """ Write something in red on the screen """
    announce("%%(BOLD)s%%(RED)s%s%%(NORMAL)s" % bmt, **kwargs)


def yellow(fmt, **kwargs):
    """ Write something in yellow on the screen """
    announce("%%(BOLD)s%%(YELLOW)s%s%%(NORMAL)s" % fmt, **kwargs)


def announce(fmt, **kwargs):
    """ Announce something """
    write(fmt, **kwargs)
    _sys.stdout.write("\n")
    _sys.stdout.flush()


