
local URL_MACHINE = "http://cloud.fse-media.group/d/API/TicketMachine/ticketmachine.lua?sign=UIiheDcpyzwKdovDZM3G-8IRZqApFgU2Kpnhe9k5ETQ=:0"

local function writeFile(path, content, binary)
  local mode = binary and "wb" or "w"
  local f = fs.open(path, mode)
  if not f then return false end
  f.write(content)
  f.close()
  return true
end

local function atomicWrite(path, content, binary)
  local tmp = path .. ".new"
  if fs.exists(tmp) then fs.delete(tmp) end
  if not writeFile(tmp, content, binary) then return false end
  if fs.exists(path) then fs.delete(path) end
  fs.move(tmp, path)
  return true
end

local function httpGet(url)
  if not http then return false, "HTTP API disabled" end
  local okReq, err = pcall(function()
    http.request({ url = url, method = "GET" })
  end)
  if not okReq then return false, tostring(err) end

  while true do
    local ev, p1, p2, p3 = os.pullEvent()
    if ev == "http_success" and p1 == url then
      local res = p2
      if type(res) == "table" and type(res.readAll) == "function" then
        local data = res.readAll()
        res.close()
        return true, data
      end
      return false, "invalid http response"
    end
    if ev == "http_failure" and p1 == url then
      local err = p2
      local res = p3
      if type(p2) == "table" and type(p2.readAll) == "function" then
        res = p2
        err = p3
      end
      if type(res) == "table" and type(res.readAll) == "function" then
        local data = res.readAll()
        res.close()
        return false, data
      end
      return false, tostring(err or "http_failure")
    end
  end
end

term.clear()
term.setCursorPos(1, 1)
print("Ticket Machine Updater")
print("")
print("Downloading ticket machine program...")

local ok, code = httpGet(URL_MACHINE)
if not ok or type(code) ~= "string" or #code == 0 then
  print("Download failed: " .. tostring(code or ""))
  return
end

if not atomicWrite("startup.lua", code, false) then
  print("Write failed: startup.lua")
  return
end
atomicWrite("startup", code, false)
if fs.exists("ticketmachine.lua") then atomicWrite("ticketmachine.lua", code, false) end

print("")
print("Done.")
print("Reboot the computer to apply the update.")
