CCCPaste
--TODO: implement -Syu

--IMPORTANT, THIS IS THE PACKAGE DATABASE
local ENCDATA ="ENCIOK/59bd0e8e27b9d34a05b997064728082a/raw/database.json"

--check if the user is stupid
if #arg == 0 then
    print("error: no operation specified  (use encpac -h for help)")
    return
end

--open the package DB
local ENCfile = fs.open("packagedb/ENCdb", "r")
if ENCfile then 
    ENC = ENCfile.readAll()
    ENC = textutils.unserialiseJSON(ENC)
    ENCfile.close()
else    
    if arg[1] ~= "-Sy" then
    print("WARNING didn't find package database")
    end
end

local function download(address)
    local answer, err = http.get("https://gist.githubusercontent.com/".. address)
    if not err then
        local data = answer.readAll()
        answer.close()
        return data 
    end
    printError(err)
    return "poopoo"
end

local function refresh()
    print("synchronizing package database..")
    print("ENC")
    fs.delete("packagedb/ENCdb")
    local file = fs.open("packagedb/ENCdb", "w")
    local data = download(ENCDATA)
    if data == "poopoo" then
        return
    end
    file.write(data)
    file.close()
    print("done!")
end

--getting all depends for package
local function checkDepends(pacName, installList)
    if ENC[pacName] then
        if not installList[pacName] then
            installList[pacName] = true
        end
        if ENC[pacName].depends then
            for _, v in ipairs(ENC[pacName].depends) do
                checkDepends(v, installList)
            end
        else
            return
        end
    else
        printError("can't find package:", pacName)
        return "poopoo"
    end
end

local function synchronize(pacName, path)
    path = path or ""
    --get depends
    print("checking dependencies\n..")
    local packsToInstall = {}
    if checkDepends(pacName, packsToInstall) == "poopoo" then
        return
    end
    print("no problems found, about to install the following:\n")
    for v, _ in pairs(packsToInstall) do
        io.write(v.." ")
    end
    print()
    io.write("\nProceed with installation?  [Y/n] ")
    local inp = io.read()
    if inp == "" or inp == "Y" or inp == "y" then
        print("installing:..")
    else
        return
    end
    for v, _ in pairs(packsToInstall) do
        print(v)    
        local data = download(ENC[v].url)
        if data == "poopoo" then
            return
        end
        local file = fs.open(path .. "/" .. ENC[v].install, "w")
        file.write(data)
        file.close()
    end
    print("done!")
end

--lookup table for arguments
local argtable = {
    ["-S"] = synchronize,

    ["-Sl"] = function(a) synchronize(arg[3], a) end,

    ["-Sy"] = refresh,

    ["-h"] = function()

    end
}
if argtable[arg[1]] then
    argtable[arg[1]](arg[2])
else
    printError("error: invalid option", arg[1])
end