// this file not for generator only

const { luaGenerator } = require('blockly/lua');

// Check if luaGenerator.forBlock is defined and initialize if necessary
if (!luaGenerator.forBlock) {
    luaGenerator.forBlock = {};
}

luaGenerator.forBlock['sysos_pullevent'] = function(block, generator) {
    var event = generator.valueToCode(block, 'EVENT', generator.ORDER_ATOMIC);

    if (event == "'All'") {
        return [`os.pullEvent()`, luaGenerator.ORDER_NONE];
    } else {
        return [`os.pullEvent(${event})`, luaGenerator.ORDER_NONE];
    }
};

luaGenerator.forBlock['sysos_pullrawevent'] = function(block, generator) {
    var event = generator.valueToCode(block, 'EVENT', generator.ORDER_ATOMIC);

    if (event == "'All'") {
        return [`os.pullEventRaw()`, luaGenerator.ORDER_NONE];
    } else {
        return [`os.pullEventRaw(${event})`, luaGenerator.ORDER_NONE];
    }
};

luaGenerator.forBlock['sysos_version'] = function(block, generator) {
    return [`os.version()`, luaGenerator.ORDER_NONE];
};

luaGenerator.forBlock['sysos_run'] = function(block, generator) {
    var env = generator.valueToCode(block, 'ENV', generator.ORDER_ATOMIC) || "{}";
    var run = generator.valueToCode(block, 'RUN', generator.ORDER_ATOMIC);
    var args = generator.valueToCode(block, 'ARGS', generator.ORDER_ATOMIC);

    if (args == "") {
        return `os.run(${env}, ${run})\n`;
    } else {
        return `os.run(${env}, ${run}, ${args})\n`;
    }
};

luaGenerator.forBlock['sysos_queue_event'] = function(block, generator) {
    var event = generator.valueToCode(block, 'EVENT', generator.ORDER_ATOMIC);
    var args = generator.valueToCode(block, 'ARGS', generator.ORDER_ATOMIC);

    if (args == "") {
        return `os.queueEvent(${event})\n`;
    } else {
        return `os.queueEvent(${event}, ${args})\n`;
    }
};

luaGenerator.forBlock['sysos_start_timer'] = function(block, generator) {
    var time = generator.valueToCode(block, 'TIME', generator.ORDER_ATOMIC);

    return [`os.queueEvent(${time})`, luaGenerator.ORDER_NONE];
};

luaGenerator.forBlock['sysos_cancel_timer'] = function(block, generator) {
    var id = generator.valueToCode(block, 'ID', generator.ORDER_ATOMIC);

    return `os.cancelTimer(${id}\n`;
};

luaGenerator.forBlock['sysos_set_alarm'] = function(block, generator) {
    var time = generator.valueToCode(block, 'TIME', generator.ORDER_ATOMIC);

    return [`os.setAlarm(${time})`, luaGenerator.ORDER_NONE];
};

luaGenerator.forBlock['sysos_cancel_alarm'] = function(block, generator) {
    var id = generator.valueToCode(block, 'ID', generator.ORDER_ATOMIC);

    return `os.cancelAlarm(${id})\n`;
};

luaGenerator.forBlock['sysos_shutdown'] = function(block, generator) {
    return `os.shutdown()`
};

luaGenerator.forBlock['sysos_reboot'] = function(block, generator) {
    return `os.reboot()`
};

luaGenerator.forBlock['sysos_get_computer_id'] = function(block, generator) {
    return [`os.getComputerID()`, luaGenerator.ORDER_NONE];
};

luaGenerator.forBlock['sysos_get_computer_label'] = function(block, generator) {
    return [`os.getComputerLabel()`, luaGenerator.ORDER_NONE];
};

luaGenerator.forBlock['sysos_set_computer_label'] = function(block, generator) {
    var label = generator.valueToCode(block, 'LABEL', generator.ORDER_ATOMIC);

    return `os.setComputerLabel(${label})\n`;
};

luaGenerator.forBlock['sysos_clock'] = function(block, generator) {
    return [`os.clock()`, luaGenerator.ORDER_NONE];
};

luaGenerator.forBlock['sysos_time'] = function(block, generator) {
    var locate = block.getFieldValue('LOCATE');

    return [`os.time("${locate}")`, generator.ORDER_ATOMIC];
};

luaGenerator.forBlock['sysos_day'] = function(block, generator) {
    var locate = block.getFieldValue('LOCATE');

    return [`os.day("${locate}")`, generator.ORDER_ATOMIC];
};

luaGenerator.forBlock['sysos_epoch'] = function(block, generator) {
    var locate = block.getFieldValue('LOCATE');

    return [`os.epoch("${locate}")`, generator.ORDER_ATOMIC];
};

luaGenerator.forBlock['sysos_date'] = function(block, generator) {
    var format = generator.valueToCode(block, 'FORMAT', generator.ORDER_ATOMIC);
    var time = generator.valueToCode(block, 'TIME', generator.ORDER_ATOMIC);

    return [`os.date(${format}, ${time})`, luaGenerator.ORDER_NONE];
};