local M = {}

local log = require('git.log')
local argv_parser = require('spacevim.api.vim.argv')

local cmds = {
  'add',
  'blame',
  'branch',
  'checkout',
  'config',
  'cherry-pick',
  'clean',
  'commit',
  'diff',
  'fetch',
  'log',
  'merge',
  'mv',
  'pull',
  'push',
  'remote',
  'reset',
  'rm',
  'reflog',
  'shortlog',
  'status',
  'grep',
  'rebase',
  'stash',
  'tag',
}
local supported_commands = {}

local function update_cmd()
  for _, v in ipairs(cmds) do
    supported_commands[v] = true
  end
end

update_cmd()


function M.run(cmdline)
  -- log.debug('cmdlien:' .. cmdline)

  local argv = argv_parser.parser(cmdline)

  -- log.debug('argvs:' .. vim.inspect(argv))

  local command = table.remove(argv, 1)

  if not supported_commands[command] then
      vim.api.nvim_echo(
        { { ':Git ' .. command .. ' is not supported', 'WarningMsg' } },
        false,
        {}
      )
    return
  end
  
  local ok, cmd = pcall(require, 'git.command.' .. command)
  if ok then
    if type(cmd.run) == 'function' then
      cmd.run(argv)
    else
      vim.api.nvim_echo(
        { { 'git.command.' .. command .. '.run  is not function', 'WarningMsg' } },
        false,
        {}
      )
    end
  else
    error(cmd)
  end
end

return M