local component = require("component")
local event = require("event")
local fs = require("filesystem")
local keyboard = require("keyboard")
local shell = require("shell")
local term = require("term")
local text = require("text")
local unicode = require("unicode")
local sides = require("sides")
local colors=require("colors")

local gpu=component.gpu
local br = component.br_reactor
local rs = component.redstone

local maxTemp = 5500

local tickCnt = 0
local minCount = 0
local tickEnergy = 0
local minEnergy = 0
local slp = 1
local rodLevel = br.getControlRodLevel(0)

local running = true
local hours = 0
local mins = 0

term.clear()
term.setCursorBlink(false)


-------------------------------------------------------------------------------
function getKey()
	return (select(4, event.pull("key_down")))
end

local function printXY(row, col, s, ...)
	term.setCursor(col, row)
	print(s:format(...))
end

local function gotoXY(row, col)
	term.setCursor(col,row)
end

local function center(row, msg)
	local mLen = string.len(msg)
	w, h = gpu.getResolution()
	term.setCursor((w - mLen)/2,row)
	print(msg)
end

local function centerF(row, msg, ...)
	local mLen = string.len(msg)
	w, h = gpu.getResolution()
	term.setCursor((w - mLen)/2,row)
	print(msg:format(...))
end

local function warning(row, msg)
	local mLen = string.len(msg)
	w, h = gpu.getResolution()
	term.setCursor((w - mLen)/2,row)
	print(msg)
end


local controlKeyCombos = {[keyboard.keys.s]=true,[keyboard.keys.w]=true,
                          [keyboard.keys.c]=true,[keyboard.keys.x]=true}


local function onKeyDown(opt)
	if opt == keyboard.keys.left then
    br.setActive(false)
  elseif opt == keyboard.keys.right then
    br.setActive(true)
  elseif opt == keyboard.keys.up then
    if (rodLevel > 0) then
		  rodLevel = rodLevel - 10
			br.setAllControlRodLevels(rodLevel)
		end
  elseif opt == keyboard.keys.down then
    if (rodLevel < 100) then
		  rodLevel = rodLevel + 10
			br.setAllControlRodLevels(rodLevel)
		end
  elseif opt == keyboard.keys.pageDown then
		br.doEjectWaste()
  elseif opt == keyboard.keys.q then
    running = false
  end
end

-------------------------------------------------------------------------------


while running do
	tickCnt = tickCnt + 1
	if tickCnt == 20 then
		mins = mins + 1
		tickCnt = 0
	end
		
	if math.fmod(tickCnt,20) == 0 then 
		br.doEjectWaste()
	end
	
	if mins == 60 then
		hours = hours + 1
		mins = 0
	end
	
	local reactorTemp = br.getCasingTemperature()
	term.setCursor(1,1)
	print("    Item     Name:          Level:           Temperature:          Fuel:          Max Fuel          Waste:")
	printXY(4, 1, "    1:       %s           %03d              %04d                  %06d         %06d            %04d",br.getControlRodName(0), br.getControlRodLevel(0), br.getFuelTemperature(0), br.getFuelAmount(0), br.getFuelAmountMax(0), br.getWasteAmount(0))
	printXY(6, 1, "    2:       %s           %03d              %04d                  %06d         %06d            %04d",br.getControlRodName(5), br.getControlRodLevel(5), br.getFuelTemperature(5), br.getFuelAmount(5), br.getFuelAmountMax(5), br.getWasteAmount(5))
	printXY(8, 1, "    3:       %s           %03d              %04d                  %06d         %06d            %04d",br.getControlRodName(3), br.getControlRodLevel(3), br.getFuelTemperature(3), br.getFuelAmount(3), br.getFuelAmountMax(3), br.getWasteAmount(3))
	printXY(10, 1, "    4:       %s           %03d              %04d                  %06d         %06d            %04d",br.getControlRodName(6), br.getControlRodLevel(6), br.getFuelTemperature(6), br.getFuelAmount(6), br.getFuelAmountMax(6), br.getWasteAmount(6))
	printXY(12, 1, "    5:       %s           %03d              %04d                  %06d         %06d            %04d",br.getControlRodName(4), br.getControlRodLevel(4), br.getFuelTemperature(4), br.getFuelAmount(4), br.getFuelAmountMax(4), br.getWasteAmount(4))
	printXY(14, 1, "    6:       %s           %03d              %04d                  %06d         %06d            %04d",br.getControlRodName(2), br.getControlRodLevel(2), br.getFuelTemperature(2), br.getFuelAmount(2), br.getFuelAmountMax(2), br.getWasteAmount(2))
	printXY(16, 1, "    7:       %s           %03d              %04d                  %06d         %06d            %04d",br.getControlRodName(7), br.getControlRodLevel(7), br.getFuelTemperature(7), br.getFuelAmount(7), br.getFuelAmountMax(7), br.getWasteAmount(7))
	printXY(18, 1, "    8:       %s           %03d              %04d                  %06d         %06d            %04d",br.getControlRodName(1), br.getControlRodLevel(1), br.getFuelTemperature(1), br.getFuelAmount(1), br.getFuelAmountMax(1), br.getWasteAmount(1))
	printXY(20, 1, "    9:       %s           %03d              %04d                  %06d         %06d            %04d",br.getControlRodName(8), br.getControlRodLevel(8), br.getFuelTemperature(8), br.getFuelAmount(8), br.getFuelAmountMax(8), br.getWasteAmount(8))
	printXY(22, 1, "   10:       Reactor        %03d              %04d                  %06d         %06d            %04d", br.getControlRodLevel(0), br.getCasingTemperature(), br.getFuelAmount(), br.getFuelAmountMax(), br.getWasteAmount())
	printXY(25, 1, "   11:       Energy Stored           %06.2f", br.getEnergyStored())
	printXY(26, 1, "   12:       Energy Last Tick           %06.2f", br.getEnergyProducedLastTick())
	
	centerF(40, "Data updates every second     Tick Count:  %2d", tickCnt)
	centerF(41, "Current up time:             %2d hours %2d min", hours, mins)
	center(42, "Left - Turn Reactor Off     Right - Turn Reactor On")
	center(43, "Up - Pull Rods 10%          Down - Lower Rods 10%  ")
	center(44, "Page Down - Eject Waste     Q - Quit               ")
	--center(39, "  ")
	
	if (reactorTemp > maxTemp) then
		term.setCursor(25,30)
		gpu.setForeground(0xFF0000)
		gpu.setBackground(0xFFFFFF)
		warning(30, "                                         ")
		warning(31, "     WARNING     WARNING     WARNING     ")
		warning(32, "                                         ")
		warning(33, "       Reactor Temperature Too High       ")
		warning(34, "                                         ")
		gpu.setForeground(0xFFFFFF)
		gpu.setBackground(0x000000)
		term.setCursor(1,41)
	else
		gpu.setForeground(0xFFFFFF)
		gpu.setBackground(0x000000)
		gotoXY(30,1)
		print()
		gotoXY(31,1)
		print()
		gotoXY(32,1)
		print()
		gotoXY(33,1)
		print()
		gotoXY(34,1)
		print()
		gpu.setForeground(0xFFFFFF)
		gpu.setBackground(0x000000)
		term.setCursor(1,47)
	end
	term.clearLine()
	print()	
  local event, address, arg1, arg2, arg3 = event.pull(1)
  if type(address) == "string" and component.isPrimary(address) then
    if event == "key_down" then
      onKeyDown(arg2)
    end
  end
end

term.clear()
term.setCursorBlink(false)