#!/usr/bin/env -S luahbtex --luaonly
if os.getenv "LUA_PATH" then
    require 'texrocks.texlua'.main(arg)
    return
end
local M = {}

---@return string version
function M.get_version()
    return _VERSION:match("%d[%d.]*%d") or "5.4"
end

---@return boolean
function M.is_venv()
    local version = M.get_version()
    local env = "LUA_PATH_" .. version:gsub("%.", "_")
    return (os.getenv "LUA_PATH" or os.getenv(env)) ~= nil
end

---expand ~ to `$HOME`
---@param dir string
---@return string
function M.expand(dir)
    if dir:sub(1, 2) == '~/' then
        return (os.getenv("HOME") or ".") .. dir:sub(2)
    end
    return dir
end

---add ~/.local/share/lua/5.3 to package.path
---add ~/.local/lib/lua/5.3 to package.cpath
function M.set_path()
    if M.is_venv() then
        return
    end
    local expand = M.expand
    local version = M.get_version()
    local ext = package.cpath:match('([^.]+)$')
    package.path = package.path
        .. ";./share/lua/" .. version .. "/?.lua;./?.lua;./?/init.lua;;"
        .. ";" .. expand("~/.local/share/lua/") .. version .. "/?.lua"
        .. ";" .. expand("~/.local/share/lua/") .. version .. "/?/init.lua"
        .. ";" .. expand("~/.local/state/nix/profile/share/lua/") .. version .. "/?.lua"
        .. ";" .. expand("~/.local/state/nix/profile/share/lua/") .. version .. "/?/init.lua"
    package.cpath = package.cpath
        .. ";./lib/lua/" .. version .. "/?." .. ext .. ";./?." .. ext
        .. ";" .. expand("~/.local/lib/lua/") .. version .. "/?." .. ext
        .. ";" .. expand("~/.local/state/nix/profile/share/lua/") .. version .. "/?." .. ext
    local f = io.open("/run/current-system/nixos-version")
    if f then
        f:close()
        package.path = package.path
            .. ";/run/current-system/sw/share/lua/" .. version .. "/?.lua"
            .. ";/run/current-system/sw/share/lua/" .. version .. "/?/init.lua"
        package.cpath = package.cpath
            .. ";/run/current-system/sw/lib/lua/" .. version .. "/?." .. ext
    else
        if package.path:gsub("/usr/share/lua/" .. version .. "/?.lua", "") == package.path then
            package.path = package.path
                .. ";/usr/share/lua/" .. version .. "/?.lua"
                .. ";/usr/share/lua/" .. version .. "/?/init.lua"
        end
        if package.cpath:gsub("/usr/lib/lua/" .. version .. "/?" .. ext, "") == package.cpath then
            package.cpath = package.cpath
                .. ";/usr/lib/lua/" .. version .. "/?." .. ext
        end
    end
end

M.set_path()
require 'texrocks.texlua'.main(arg)
