local platform = vim.uv.os_uname()
local deps_install_dir = table.remove(_G.arg, 1)
local subcommand = table.remove(_G.arg, 1)
local suffix = (platform and platform.sysname:lower():find 'windows') and '.dll' or '.so'
package.path = (deps_install_dir .. '/share/lua/5.1/?.lua;')
  .. (deps_install_dir .. '/share/lua/5.1/?/init.lua;')
  .. package.path
package.cpath = deps_install_dir .. '/lib/lua/5.1/?' .. suffix .. ';' .. package.cpath

local uv = vim.uv

-- we use busted and luacheck and their lua dependencies
-- But installing their binary dependencies with luarocks is very
-- slow, replace them with vim.uv wrappers

local system = {}
package.loaded['system.core'] = system
function system.monotime()
  uv.update_time()
  return uv.now() * 1e-3
end
function system.gettime()
  local sec, usec = uv.gettimeofday()
  return sec + usec * 1e-6
end
function system.sleep(sec)
  uv.sleep(sec * 1e3)
end

local term = {}
package.loaded['term.core'] = term
function term.isatty(_)
  return uv.guess_handle(1) == 'tty'
end

local lfs = { _VERSION = 'fake' }
package.loaded['lfs'] = lfs

function lfs.attributes(path, attr)
  local stat = uv.fs_stat(path)
  if attr == 'mode' then
    return stat and stat.type or ''
  elseif attr == 'modification' then
    if not stat then
      return nil
    end
    local mtime = stat.mtime
    return mtime.sec + mtime.nsec * 1e-9
  else
    error('not implemented')
  end
end

function lfs.currentdir()
  return uv.cwd()
end

function lfs.chdir(dir)
  local status, err = pcall(uv.chdir, dir)
  if status then
    return true
  else
    return nil, err
  end
end

function lfs.dir(path)
  local fs = uv.fs_scandir(path)
  return function()
    if not fs then
      return
    end
    return uv.fs_scandir_next(fs)
  end
end

function lfs.mkdir(dir)
  return uv.fs_mkdir(dir, 493) -- octal 755
end

if subcommand == 'busted' then
  require 'busted.runner'({ standalone = false })
elseif subcommand == 'luacheck' then
  require 'luacheck.main'
else
  error 'unknown subcommand'
end
