/// @addtogroup sefun
/// @{
/// @file terminal
/// @brief simul_efuns related to terminal in-/output
/// @author Wayfarer@Portals
/// @version 1.0.0
/// @date 2016-01-27

// special functions for generating vt100 character sequences
// Adjusted by Watcher to make it more termcapish and to use ansi.h
// 2016-01-27 Gwenhyvar:
// switched from if to switch in preparation for other terminal types

#include <colors.h>         // mudlib internal color definitions
#include <ansi.h>           // ansi control sequences for vt100 compatible output devices

private mapping strip_patterns;

private void init_terminal_sefuns(void)
{
    strip_patterns = ([
            "vt100": VT100_STRIP_ME,
            ]);
}

// --------------------------------------------------------------------------
/// @brief supported_terminals 
/// @Returns array of supported terminal types
// --------------------------------------------------------------------------
public string *supported_terminals(void)
{
    return keys(strip_patterns);
}

// --------------------------------------------------------------------------
/// @brief strip_term_codes 
/// strip controlcodes for either given or any terminal type from text
/// @Param str
/// @Param term
/// @Returns 
// --------------------------------------------------------------------------
public string strip_term_codes(string str, string term = "@any@")
{
    if(!str || str == "")
        return "";
    if(term == "@any@")
    {
        foreach(term in keys(strip_patterns))
        {
            foreach(string pattern in strip_patterns[term])
            {
                str = replace_string(str, pattern, "");
            }
            if(str == "")           // oops! nothing left...
                return "";
        }
    }
    else
        foreach(string pattern in strip_patterns[term])
            str = replace_string(str, pattern, "");
    return str;
}

// --------------------------------------------------------------------------
/// @brief normal
/// resets output to normal (bold/underline/... off)
/// @Returns 
// --------------------------------------------------------------------------
public string normal(void)
{
    switch((string)this_player()->query_env("TERM"))
    {
        case "vt100":
            return VT100_NOR;
        default:
            return "";
    }
}

// --------------------------------------------------------------------------
/// @brief inverse 
/// switch foreground and background color for given text
/// @Param str
/// @Returns 
// --------------------------------------------------------------------------
public string inverse(string str)
{
    switch((string)this_player()->query_env("TERM"))
    {
        case "vt100":
            return VT100_REV + str + VT100_NOR;
        default:
            return str;
    }
}

// --------------------------------------------------------------------------
/// @brief blink 
/// enable blink mode for given text
/// @Param str
/// @Returns 
// --------------------------------------------------------------------------
public string blink(string str)
{
    switch((string)this_player()->query_env("TERM"))
    {
        case "vt100":
            return VT100_BLINK + str + VT100_NOR;
        default:
            return str;
    }
}

// --------------------------------------------------------------------------
/// @brief bold 
/// enable bold mode for given text
/// @Param str
/// @Returns 
// --------------------------------------------------------------------------
public string bold(string str)
{
    switch((string)this_player()->query_env("TERM"))
    {
        case "vt100":
            return VT100_BOLD + str + VT100_NOR;
        default:
            return str; 
    }
}

// --------------------------------------------------------------------------
/// @brief underscore 
/// enable underscoring for given text
/// @Param str
/// @Returns 
// --------------------------------------------------------------------------
public string underscore(string str)
{
    switch((string)this_player()->query_env("TERM"))
    {
        case "vt100":
            return VT100_U + str + VT100_NOR;
        default:
            return str;
    }
}

// --------------------------------------------------------------------------
/// @brief clear_screen 
/// clear any output
/// cursor position depends on flag:
/// 0: keep position
/// 1: move home
/// @Returns 
// --------------------------------------------------------------------------
public string clear_screen(int flag = 0)
{
    switch((string)this_player()->query_env("TERM"))
    {
        case "vt100":
            return (flag ? VT100_REF : VT100_CLR);
        default:
            return "";
    }
}

// --------------------------------------------------------------------------
/// @brief clear_line 
/// clear current line
/// @Returns 
// --------------------------------------------------------------------------
public string clear_line(void)
{
    switch((string)this_player()->query_env("TERM"))
    {
        case "vt100":
            return VT100_CSI + "2K";
        default:
            return "";
    }
}

// --------------------------------------------------------------------------
/// @brief up_line 
/// move cursor one line up
/// @Returns 
// --------------------------------------------------------------------------
public string up_line(void)
{
    switch((string)this_player()->query_env("TERM"))
    {
        case "vt100":
            return VT100_CSI + "A"; 
        default:
            return "";
    }
}

// --------------------------------------------------------------------------
/// @brief erase_line 
/// clear current line and scroll remaining screen one line up
/// @Returns 
// --------------------------------------------------------------------------
public string erase_line(void)
{
    switch((string)this_player()->query_env("TERM"))
    {
        case "vt100":
            return clear_line() + VT100_CSI + "79D";
        default:
            return "\n";
    }
}

// --------------------------------------------------------------------------
/// @brief set_fg_color 
/// set foreground color for following output
/// @Param color
/// @Param bright
/// @Returns 
// --------------------------------------------------------------------------
public string set_fg_color(int color = COL_WHITE, int bright = 0)
{
    switch((string)this_player()->query_env("TERM"))
    {
        case "vt100":
            switch(color)
            {
                case COL_BLACK:     return (bright ? VT100_HBLK : VT100_BLK);
                case COL_RED:       return (bright ? VT100_HRED : VT100_RED);
                case COL_GREEN:     return (bright ? VT100_HGRN : VT100_GRN);
                case COL_YELLOW:    return (bright ? VT100_HYEL : VT100_YEL);
                case COL_BLUE:      return (bright ? VT100_HBLU : VT100_BLU);
                case COL_MAGENTA:   return (bright ? VT100_HMAG : VT100_MAG);
                case COL_CYAN:      return (bright ? VT100_HCYN : VT100_CYN);
                case COL_WHITE:     return (bright ? VT100_HWHT : VT100_WHT);
                default:            error("unknown color code: " + itoa(color));
            }
        default:
            return "";
    }
}

// --------------------------------------------------------------------------
/// @brief set_bg_color 
/// set background color for following output
/// @Param color
/// @Param bright
/// @Returns 
// --------------------------------------------------------------------------
public string set_bg_color(int color = COL_BLACK, int bright = 0)
{
    switch((string)this_player()->query_env("TERM"))
    {
        case "vt100":
            switch(color)
            {
                case COL_BLACK:     return (bright ? VT100_HBBLK : VT100_BBLK);
                case COL_RED:       return (bright ? VT100_HBRED : VT100_BRED);
                case COL_GREEN:     return (bright ? VT100_HBGRN : VT100_BGRN);
                case COL_YELLOW:    return (bright ? VT100_HBYEL : VT100_BYEL);
                case COL_BLUE:      return (bright ? VT100_HBBLU : VT100_BBLU);
                case COL_MAGENTA:   return (bright ? VT100_HBMAG : VT100_BMAG);
                case COL_CYAN:      return (bright ? VT100_HBCYN : VT100_BCYN);
                case COL_WHITE:     return (bright ? VT100_HBWHT : VT100_BWHT);
                default:            error("unknown color code: " + itoa(color));
            }
        default:
            return "";
    }
}
///  @}
