---library for lua-open
---@module open
---@copyright 2025
---@diagnostic disable: undefined-field
-- luacheck: ignore 143
local lfs = require 'lfs'
local texrocks = require 'texrocks'

local M = {}

---get file path according to `lux.toml`
---@param file string PDF file name
---@return string file PDF file path
function M.get_path(file)
   if lfs.isfile(file) then
       return file
   end
   if not lfs.isfile('lux.toml') then
       error(string.format("%s cannot be found", file))
       os.exit(1)
   end
   local f = io.open("lux.toml")
   if f == nil then
       os.exit(1)
   end
   local text = f:read("*a")
   f:close()
   local data = require 'toml'.parse(text)
   local cwd
   if data.package == nil or data.version == nil then
       os.exit(1)
   end
   local pkg = string.format("%s@%s", data.package, data.version)
   if data.version:match("-") == nil then
       pkg = pkg .. "-1"
   end
   for path in package.path:gmatch("[^;]+") do
       if path:match("%-" .. pkg:gsub("%-", "%%-")) then
           cwd = path:gsub("/%?.*", ""):gsub("/src$", "/etc/conf")
           break
       end
   end
   if cwd == nil then
       error(string.format("%s cannot be found", pkg))
       os.exit(2)
   end
   local path
   for dst, src in pairs(data.build.install.conf) do
       if src == file then
           path = dst
           break
       end
   end
   if path == nil then
       error(string.format("%s's %s still cannot be found", pkg, file))
       os.exit(3)
   end
   return table.concat({ cwd, path }, '/')
end

---escape and concatenate command line arguments for printing
---@param args string[] command line arguments
---@return string cmd command line
function M.get_cmd(args)
   local cmd = {}
   for _, v in ipairs(args) do
       v = v:gsub(" ", "\\ ")
       table.insert(cmd, v)
   end
   return table.concat(cmd, " ")
end

---use correct system tool to open PDF
---@param file string PDF file path
---@return string[] args command line arguments
function M.get_cmd_args(file)
   if os.name == 'macosx' then
       return { "open", file }
   elseif os.name == 'windows' or os.name == 'cygwin' then
       return { "start", file }
   elseif os.getenv "PREFIX" then
       return { "termux-open", file }
   elseif file:gsub(".*%.", "") == "pdf" and os.getenv "DISPLAY" == nil then
       return { "pdftotext", file, "-" }
   else
       return { "xdg-open", file }
   end
end

---**entry for lua-open**
---@param args string[] command line arguments
function M.main(args)
   local file = M.get_path(args[1])
   local cmd_args = M.get_cmd_args(file)
   if file ~= args[1] then
       print('$ ' .. M.get_cmd(cmd_args))
   end
   texrocks.exec(cmd_args)
end

return M