from browser import document, window, timer
from tests import do_tests
import sys
import traceback

jq = window.jQuery
interval = None
ns = {'__name__':'__main__'}

def clearConsole():
    document["console"].value = ""

def clearDisplay():
    jq("#display").children().css("background-color", "").attr("x-color", "")

def run(*args):
    global interval, ns
    stop()
    clearConsole()
    clearDisplay()
    jq('#display').keydown(keydown)
    try:
        ns = {'__name__':'__main__'}
        exec(window.editor.getValue(), ns)
        exec("initialise()", ns)
        interval = timer.set_interval(run_loop, 100);
    except Exception as exc:
        traceback.print_exc(file=sys.stderr)

def run_loop():
    try:
        exec("boucle()", ns)
    except Exception as exc:
        traceback.print_exc(file=sys.stderr)

def stop(*args):
    global interval
    jq('#display').off('keydown')
    if interval:
        timer.clear_interval(interval)
        interval = None

def reset(*args):
    stop()
    window.reloadTemplate()

def run_tests(*args):
    stop()
    clearConsole()
    clearDisplay()
    ns = {'__name__': '__main__'}
    try:
        exec(window.editor.getValue(), ns)
    except Exception as exc:
        traceback.print_exc(file=sys.stderr)
    do_tests(ns)

# Todo : vérifier si les fonctions existent
def keydown(e):
    exec("touche_appuyee(" + str(e.keyCode) + ")", ns)
    e.preventDefault()

jq('#run').click(run)
jq('#stop').click(stop)
jq("#reset").click(reset);
jq("#test").click(run_tests);

class cOutput:
    encoding = 'utf-8'

    def __init__(self):
        self.cons = document["console"]
        self.buf = ''

    def write(self, data):
        self.buf += str(data)

    def flush(self):
        self.cons.value += self.buf
        self.buf = ''
        self.cons.scrollTop = self.cons.scrollHeight;

    def __len__(self):
        return len(self.buf)

cOut = cOutput()
sys.stdout = cOut
sys.stderr = cOut

info = sys.implementation.version
version = "Python %s.%s.%s on %s %s\n" % (
    info[0], info[1], info[2], window.navigator.appName, window.navigator.appVersion)
print(version)

jq('.btn').removeAttr('disabled').removeClass('disabled')
