-- vi: ft=lua

local hostname = "pocket_computer" .. os.getComputerID()

redstone_toggle_id = 50
de_store_mon_id = 45

function dump(o)
    if o == nil then
        return ""
    end

    if type(o) == 'table' then
        local s = '{ '
        for k,v in pairs(o) do
            if type(k) ~= 'number' then k = '"'..k..'"' end
            s = s .. '['..k..'] = ' .. dump(v) .. ','
        end
        return s .. '} '
    end

    return tostring(o)
end

function poll()
    while true do
        if redstone_toggle_id ~= nil then
            rednet.send(redstone_toggle_id, "get_state")
        end
        if de_store_mon_id ~= nil then
            rednet.send(de_store_mon_id, "get_stats")
        end
        sleep(1)
    end
end

function recv()
    local redstone_toggle_state
    local de_store_energy_stored, de_store_max_energy_stored, de_store_transfer_per_tick
    local updated = false
    while true do
        local id, data = rednet.receive()
        if id == redstone_toggle_id then
            if type(data) == 'table' then
                if data[1] == 'output_state' then
                    redstone_toggle_state = data[2]
                    updated = true
                end
            end
        elseif id == de_store_mon_id then
            if type(data) == 'table' then
                if data[1] == 'energyStored' then
                    de_store_energy_stored = data[2]
                end
                if data[3] == 'maxEnergyStored' then
                    de_store_max_energy_stored = data[4]
                end
                if data[5] == 'transferPerTick' then
                    de_store_transfer_per_tick = data[6]
                end
                updated = true
            end
        end

        if updated == true then
            term.clear()
            term.setCursorPos(1, 1)
            term.setTextColor(colors.white)
            term.setBackgroundColor(colors.black)
            write('Press "T" to toggle the rainbows.\n')
            term.write('Rainbows state: ')
            if redstone_toggle_state == true then
                term.setBackgroundColor(colors.green)
                write('On\n')
            elseif redstone_toggle_state == false then
                term.setBackgroundColor(colors.red)
                write('Off\n')
            elseif redstone_toggle_state == nil then
                term.setBackgroundColor(colors.purple)
                write('Unknown\n')
            end
            term.setBackgroundColor(colors.black)
            print()
            print('Draconic Storage')
            print('Current: ' .. de_store_energy_stored)
            print('Max: ' .. de_store_max_energy_stored)
            print('Transfer per Tick: ' .. de_store_transfer_per_tick)
        end
    end
end

function key_watcher()
    while true do
        local event, param = os.pullEvent("key")
        if event == "key" then
            -- print("Got key: " .. param)
            if param == keys.backspace then
                break
            elseif param == keys.t then
                rednet.send(redstone_toggle_id, 'toggle')
            end
        end
    end
end

local sides = peripheral.getNames()
for i = 1, #sides do
    if peripheral.getType(sides[i]) == "modem" then
        modemSide = sides[i]
        break
    end
end

rednet.open(modemSide)
rednet.host("rmm", hostname)

parallel.waitForAny(poll, recv, key_watcher)
rednet.close(modemSide)