pcall(require, "luacov")

local Path = require("plenary.path")
local u = require("tests.utils")
local verify = require("tests.utils.verify")

local run_in_current_command = function(command, expected_tree_node)
  local winid = vim.api.nvim_get_current_win()

  vim.cmd(command)
  verify.window_handle_is(winid)
  verify.buf_name_endswith(string.format("neo-tree filesystem [%s]", winid), 1000)
  if expected_tree_node then
    verify.filesystem_tree_node_is(expected_tree_node, winid)
  end
end

local run_close_command = function(command)
  vim.cmd(command)
  u.wait_for(function() end, { interval = 200, timeout = 200 })
end

describe("Command", function()
  local test = u.fs.init_test({
    items = {
      {
        name = "foo",
        type = "dir",
        items = {
          {
            name = "bar",
            type = "dir",
            items = {
              { name = "baz1.txt", type = "file" },
              { name = "baz2.txt", type = "file", id = "deepfile2" },
            },
          },
        },
      },
      { name = "topfile1.txt", type = "file", id = "topfile1" },
      { name = "topfile2.txt", type = "file", id = "topfile2" },
    },
  })

  test.setup()

  local fs_tree = test.fs_tree

  after_each(function()
    u.clear_environment()
  end)

  describe("netrw style:", function()
    it("`:Neotree current` should show neo-tree in current window", function()
      local cmd = "Neotree current"
      run_in_current_command(cmd)
    end)

    it(
      "`:Neotree current reveal` should show neo-tree and reveal file in current window",
      function()
        local cmd = "Neotree current reveal"
        local testfile = fs_tree.lookup["topfile1"].abspath
        u.editfile(testfile)
        run_in_current_command(cmd, testfile)
      end
    )

    it("`:Neotree current reveal toggle` should toggle neo-tree in current window", function()
      local cmd = "Neotree current reveal toggle"
      local testfile = fs_tree.lookup["topfile1"].abspath
      u.editfile(testfile)
      local tree_winid = vim.api.nvim_get_current_win()

      -- toggle OPEN
      run_in_current_command(cmd, testfile)

      -- toggle CLOSE
      run_close_command(cmd)
      verify.window_handle_is(tree_winid)
      verify.buf_name_is(testfile)
    end)

    it(
      "`:Neotree current reveal_force_cwd reveal_file=xyz` should reveal file current window if cwd is not a parent of file",
      function()
        vim.cmd("cd ~")
        local testfile = fs_tree.lookup["deepfile2"].abspath
        local cmd = "Neotree current reveal_force_cwd reveal_file=" .. testfile
        run_in_current_command(cmd, testfile)
      end
    )

    it(
      "`:Neotree current reveal_force_cwd reveal_file=xyz` should reveal file current window if cwd is a parent of file",
      function()
        local testfile = fs_tree.lookup["deepfile2"].abspath
        local testfile_dir = Path:new(testfile):parent().filename
        vim.cmd(string.format("cd %s", testfile_dir))
        local cmd = "Neotree current reveal_force_cwd reveal_file=" .. testfile
        run_in_current_command(cmd, testfile)
      end
    )
  end)

  test.teardown()
end)
