use std.utils;
use std.unix;

var screen_state = {
    width: 0,
    height: 0
};

screen_state.update = func() {
    var res = utils.terminal_size();
    me.width = res.cols;
    me.height = res.rows;
}

screen_state.clear_screen = func() {
    me.update();

    var screen = "\e[0;0H";
    for (var i = 0; i < me.height; i+=1) {
        for (var j = 0; j < me.width; j+=1) {
            screen ~= " ";
        }
        if (i != me.height - 1)
            screen ~= "\n";
    }
    print(screen, "\e[0;0H");
}

screen_state.put_pixel = func(x, y, c) {
    x = int(x);
    y = int(y);
    if (x < 0 or x >= me.width or y < 0 or y >= me.height)
        return;
    var coord = "\e[" ~ y ~ ";" ~ x ~ "H";
    print(coord, c, "\e[0;0H");
}

var test_flush = func() {
    screen_state.clear_screen();
    for(var i=0; i<1e6; i+=1) {
        unix.sleep(0.001);
        screen_state.update();
        screen_state.put_pixel(
            rand()*screen_state.width,
            rand()*screen_state.height,
            "\e[38;5;" ~ int(256*rand()) ~ "m" ~ char(65 + 26*rand()) ~ "\e[0m"
        );
        print("\e[0;0H", i);
    }

    screen_state.clear_screen();
    println();
}