--:Minify:--
syscall.TTY_clear()
syscall.TTY_setTextColor(1)
syscall.TTY_setCursorPos(1, 1)
syscall.TTY_print("HyperionOS Bash Shell")
local str=""
local stopInput=false
local inputIO=syscall.IO_getBoundQueue()
local pid=syscall.getpid()
local proc=0
local fs=require("sys.fs")
local timeout=false
printInline("> ")
while true do
    local event = {syscall.IO_pullEvent()}
    if event[1] then
        if not stopInput then
            if event[1]=="keyTyped" then
                if event[3]=="\b" then
                    if #str>0 then
                        str=str:sub(1,#str-1)
                        printInline("\b")
                    end
                elseif event[3]=="\n" then
                    print("")
                    stopInput=true
                    if str == "" then
                        printInline("> ")
                        stopInput=false
                    else
                        local path=nil
                        if fs.exists("/bin/"..str) then
                            path="/bin/"..str
                        elseif fs.exists("/bin/"..str..".lua") then
                            path="/bin/"..str..".lua"
                        end
                        if not path then
                            print("Program not found")
                            printInline("> ")
                            stopInput=false
                        else
                            local text = fs.readAllText(path)
                            local program, err = load(text, path)
                            if not program then
                                print(err)
                                printInline("> ")
                            end
                            syscall.IO_bind("bash:"..tostring(pid))
                            proc = syscall.spawn(program, path)
                            syscall.IO_bind(inputIO)
                        end
                        str=""
                    end
                else
                    str=str..event[3]
                    printInline(event[3])
                end
            end
        end
        timeout=false
    else
        timeout=true
    end
    if stopInput then
        local exited, code = syscall.collect(proc)
        if exited then
            print("\nTask exited with code:\n"..tostring(code))
            printInline("> ")
            stopInput=false
        else
            if event[1] then
                if event[1]=="keyTyped" and event[3]=="^c" then
                    syscall.kill(proc)
                    print("Terminated")
                    printInline("> ")
                    stopInput=false
                elseif event[1]=="keyTyped" and event[3]=="^d" then
                    syscall.kill(proc)
                    syscall.exit(0)
                else
                    syscall.IO_pushEvent("bash:"..tostring(pid), table.unpack(event))
                end
            end
        end
    end
    if timeout then
        sleep(.05)
    end
end