-- Provides the Format, FormatWrite, FormatLock, and FormatWriteLock commands
require("formatter").setup({
  -- Enable or disable logging
  logging = true,
  -- Set the log level
  log_level = vim.log.levels.WARN,
  -- All formatter configurations are opt-in
  filetype = {
    json = {
      require("formatter.filetypes.json").jq,
    },
    lua = {
      require("formatter.filetypes.lua").stylua,
    },
    nix = {
      require("formatter.filetypes.nix").nixpkgs_fmt,
    },
    python = {
      require("formatter.filetypes.python").black,
    },
    rust = {
      require("formatter.filetypes.rust").rustfmt,
    },
    sh = {
      require("formatter.filetypes.sh").shfmt,
    },
    toml = {
      require("formatter.filetypes.toml").taplo,
    },
    yaml = {
      require("formatter.filetypes.yaml").yamlfmt,
    },

    -- HACK to use specific formatters only when specified
    alejandra = {
      require("formatter.filetypes.nix").alejandra,
    },
    isort = {
      require("formatter.filetypes.python").isort,
    },

    -- Use the special "*" filetype for defining formatter configurations on
    -- any filetype
    ["*"] = {
      -- "formatter.filetypes.any" defines default configurations for any
      -- filetype
      require("formatter.filetypes.any").remove_trailing_whitespace,
    },
  },
})

vim.api.nvim_create_user_command("Fmt", function(opts)
  local params = vim.split(opts.args, "%s+", { trimempty = true })
  local filetype = vim.bo.filetype
  vim.cmd("set filetype=" .. params[1]) -- fake filetype
  vim.cmd(":Format")
  vim.cmd("set filetype=" .. filetype) -- restore original filetype
end, {
  nargs = 1,
  complete = function()
    local languages = {
      nix = { "alejandra" },
      python = { "isort" },
    }
    return languages[vim.bo.filetype] or {}
  end,
})

require("which-key").register({
  ["="] = { "<cmd>Format<cr>", "format (formatter)" },
}, { noremap = true, silent = true })