import * as wasm from "./wasm/nexrad_browser.js";
await wasm.default();
wasm.__nxrd_browser_init();

console.log("[JS] setup event listeners");

console.log("[JS] initializing the renderer");

const DEFAULT_PREFERENCES = {
    RR: 5,
    RREN: true,
    FCS: 20
};
let preferences = DEFAULT_PREFERENCES;

function get_font_size() { return `${preferences.FCS}px monospace`; }

const canvas = document.getElementById("canvas");

function setupCanvas(canvas) {
    // Get the device pixel ratio, falling back to 1.
    var dpr = window.devicePixelRatio || 1;
    // Get the size of the canvas in CSS pixels.
    var rect = canvas.getBoundingClientRect();
    // Give the canvas pixel dimensions of their CSS
    // size * the device pixel ratio.
    canvas.width = rect.width * dpr;
    canvas.height = rect.height * dpr;
    var ctx = canvas.getContext('2d');
    // Scale all drawing operations by the dpr, so you
    // don't have to worry about the difference.
    ctx.scale(dpr, dpr);
    return ctx;
}

function rescaleCanvas(canvas, ctx) {
    var dpr = window.devicePixelRatio || 1;
    // Get the size of the canvas in CSS pixels.
    var rect = canvas.getBoundingClientRect();
    // Give the canvas pixel dimensions of their CSS
    // size * the device pixel ratio.
    canvas.width = rect.width * dpr;
    canvas.height = rect.height * dpr;
    // Scale all drawing operations by the dpr, so you
    // don't have to worry about the difference.
    ctx.scale(dpr, dpr);
}

const ctx = setupCanvas(canvas);

const FIFTY_MILES = 0.0916;
let current_lat = 38.8977;
let current_long = -77.036560;

function calcRenderbox() {
    return [current_long - FIFTY_MILES, current_lat - FIFTY_MILES, current_long + FIFTY_MILES, current_lat + FIFTY_MILES];
}

function latlongXY(lat, long) {
    let bbox = calcRenderbox();
    let pixelWidth = canvas.width;
    let pixelHeight = canvas.height;
    let bboxWidth = bbox[2] - bbox[0];
    let bboxHeight = bbox[3] - bbox[1];
    let widthPct = ( long - bbox[0] ) / bboxWidth;
    let heightPct = ( lat - bbox[1] ) / bboxHeight;
    let x = Math.floor( pixelWidth * widthPct );
    let y = Math.floor( pixelHeight * ( 1 - heightPct ) );
    return { x, y };
}

let x0 = 0;
let y0 = 0;
let xfull = canvas.width;
let yfull = canvas.height;

function recalcBorderCoordinates() {
    let xy = latlongXY(current_lat, current_long);

    x0 = xy.x - canvas.width;
    y0 = xy.y - canvas.height;
    xfull = x0 + canvas.width;
    yfull = y0 + canvas.width;
}

const red = "#ef0000";
const green = "#4af626";
const white = "#dedede";

let blinkyColor = "#dedede";

setInterval(() => {
    if (blinkyColor === red) {
        blinkyColor = white;
    } else {
        blinkyColor = red;
    }
}, 350);

function zulu() {
    let date = new Date();
    return `${date.getUTCHours().toString().padStart(2, '0')}:${date.getUTCMinutes().toString().padStart(2, '0')}:${date.getUTCSeconds().toString().padStart(2, '0')}Z`;
}

let command_buf = "";
let buf_response_mode = false;

function exec() {
    console.log("exec1!");
}

document.onkeyup = (e) => {
    if (e.key.toUpperCase() === "ESCAPE") {
        command_buf = "";
    } else if (e.key.toUpperCase() === "ENTER") {
        command_buf = "";
        exec();
    } else if (e.key.toUpperCase() === "BACKSPACE") {
        command_buf = command_buf.slice(0, command_buf.length-1);
        exec();
    } else {
        if (e.key.length !== 1) { return; }
        if (buf_response_mode) {
            buf_response_mode = false;
            command_buf = "";
        }
        command_buf += e.key.toUpperCase();
    }
}

setInterval(() => {
    //document.getElementById("input-detection").focus();
    rescaleCanvas(canvas, ctx);
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    ctx.resetTransform();

    recalcBorderCoordinates();

    let xy = latlongXY(current_lat, current_long);

    ctx.translate(xy.x, xy.y);

    // background (black, always)
    ctx.fillStyle = "black";
    ctx.fillRect(x0, y0, xfull * 2, yfull * 2);

    ctx.font = get_font_size();
    ctx.fillStyle = green;
    ctx.fillText(`NEXRAD KLSX ${zulu()}`, x0 + 50, y0 + 50);

    ctx.fillStyle = blinkyColor;
    ctx.fillText("RADR INOP NO DATA LOADED", x0 + 50, y0 + 50 + preferences.FCS);
    ctx.fillStyle = green;

    ctx.textAlign = "right";
    ctx.fillText("RADAR SITE", xfull - 75, y0 + 50);
    ctx.fillText("KLSX VCP35 Clear Air Mode", xfull - 75, y0 + 50 + preferences.FCS);

    ctx.fillText("MODE", xfull - 75, y0 + canvas.height / 3);
    ctx.fillText(" REF   VEL   SW  ", xfull - 75, y0 + canvas.height / 3 + preferences.FCS);
    ctx.fillText(" ZDR   PHI   RHO ", xfull - 75, y0 + canvas.height / 3 + preferences.FCS * 2);
    ctx.fillText(" CFP             ", xfull - 75, y0 + canvas.height / 3 + preferences.FCS * 3);

    ctx.fillStyle = white;

    ctx.fillText("      >RADR INOP<", xfull - 75, y0 + canvas.height / 3 + preferences.FCS * 3);

    ctx.fillStyle = green;
    ctx.textAlign = "left";

    ctx.fillText(command_buf, x0 + 50, y0 + canvas.height / 2);
}, 10);