################################################################################
#                                                                              #
# Copyright (c) Microsoft Corporation.
# Licensed under the MIT license.
#                                                                              #
################################################################################

import sys, os
import time # time.sleep is in seconds

if os.name == 'nt':
    import ctypes
    hOut = ctypes.windll.kernel32.GetStdHandle(-11)
    out_modes = ctypes.c_uint32()
    ENABLE_VT_PROCESSING = ctypes.c_uint32(0x0004)
    ctypes.windll.kernel32.GetConsoleMode(hOut, ctypes.byref(out_modes))
    out_modes = ctypes.c_uint32(out_modes.value | 0x0004)
    ctypes.windll.kernel32.SetConsoleMode(hOut, out_modes)
    setcp_result = ctypes.windll.kernel32.SetConsoleOutputCP(65001)
    if not setcp_result:
        gle = ctypes.windll.kernel32.GetLastError()
        print('SetConsoleOutputCP failed with error {}'.format(gle))
        exit(0)
    setcp_result = ctypes.windll.kernel32.SetConsoleCP(65001)
    if not setcp_result:
        gle = ctypes.windll.kernel32.GetLastError()
        print('SetConsoleCP failed with error {}'.format(gle))
        exit(0)
    import codecs
    codecs.register(lambda name: codecs.lookup('utf-8') if name == 'cp65001' else None)
    sys.stdout = codecs.getwriter('utf8')(sys.stdout)
    sys.stderr = codecs.getwriter('utf8')(sys.stderr)

def write(s):
    sys.stdout.write(s)

def esc(seq):
    write('\x1b{}'.format(seq))

def csi(seq):
    sys.stdout.write('\x1b[{}'.format(seq))

def osc(seq):
    sys.stdout.write('\x1b]{}\x07'.format(seq))

def cup(r=0, c=0):
    csi('H') if (r==0 and c==0) else csi('{};{}H'.format(r, c))

def cupxy(x=0, y=0):
    cup(y+1, x+1)

def margins(top=0, bottom=0):
    csi('{};{}r'.format(top, bottom))

def clear_all():
    cupxy(0,0)
    csi('2J')

def sgr(code=0):
    csi('{}m'.format(code))

def sgr_n(seq=None):
    """Apply multiple SGR (Select Graphic Rendition) parameters.

    Parameters
    ----------
    seq : Iterable of int | None
        Sequence of numeric SGR codes to emit. If ``None`` (default) an empty
        sequence is assumed. A mutable default argument must be avoided to
        prevent unwanted state sharing between calls.
    """
    if seq is None:
        seq = []
    csi('{}m'.format(';'.join(str(code) for code in seq)))

def tbc():
    """
    Clear all tabstops from the terminal.
    Tab will take the cursor to the last column, then the first column.
    """
    csi('3g')

def ht():
    write('\t')

def cbt():
    csi('Z')

def hts(column=-1):
    if column > 0:
        csi(';{}H'.format(column))
    esc('H')

def alt_buffer():
    csi('?1049h')

def main_buffer():
    csi('?1049l')

def flush(timeout=0):
    sys.stdout.flush()
    time.sleep(timeout)

def set_color(index, r, g, b):
    osc('4;{};rgb:{:02X}/{:02X}/{:02X}'.format(index, r, g, b))

if __name__ == '__main__':
    clear_all()
    print('This is the VT Test template.')
