-- Panama desktop integration.
--
-- Neovim is the one application here that neither reads the desktop portal nor
-- has a control socket open by default, so it reads the shared settings file
-- directly -- the same ~/.config/panama/settings.json that the shell and the
-- Hyprland config read.
--
-- Nothing here may raise. A missing or malformed settings file must cost the
-- user their color scheme preference and nothing else; editing text is more
-- important than matching the desktop.

local M = {}

local function settings_path()
  local config_home = os.getenv("XDG_CONFIG_HOME")
  if config_home == nil or config_home == "" then
    local home = os.getenv("HOME")
    if home == nil or home == "" then
      return nil
    end
    config_home = home .. "/.config"
  end
  return config_home .. "/panama/settings.json"
end

-- "dark" or "light". Defaults to dark, which is what Panama ships.
function M.color_scheme()
  local path = settings_path()
  if not path then
    return "dark"
  end

  local ok, contents = pcall(function()
    local file = io.open(path, "r")
    if not file then
      return nil
    end
    local text = file:read("*a")
    file:close()
    return text
  end)
  if not ok or not contents or contents == "" then
    return "dark"
  end

  local decoded_ok, decoded = pcall(vim.json.decode, contents)
  if not decoded_ok or type(decoded) ~= "table" then
    return "dark"
  end

  return decoded.colorScheme == "light" and "light" or "dark"
end

function M.is_light()
  return M.color_scheme() == "light"
end

-- tokyonight ships a light variant in the same family, so light mode stays the
-- same identity rather than becoming a different editor theme.
function M.tokyonight_style()
  return M.is_light() and "day" or "moon"
end

-- Re-apply the scheme when the window regains focus.
--
-- Neovim reads the setting once at startup and has no control socket open by
-- default, so an editor already running when the desktop scheme flips would
-- otherwise stay on the old palette until it was restarted. FocusGained is
-- cheap, happens exactly when you would notice the mismatch, and does nothing
-- at all unless the scheme actually changed.
function M.watch()
  local applied = M.color_scheme()

  vim.api.nvim_create_autocmd("FocusGained", {
    group = vim.api.nvim_create_augroup("PanamaColorScheme", { clear = true }),
    callback = function()
      local current = M.color_scheme()
      if current == applied then
        return
      end
      applied = current
      vim.o.background = current
      pcall(vim.cmd.colorscheme, current == "light" and "tokyonight-day" or "tokyonight-moon")
    end,
  })
end

return M
