local wezterm = require("wezterm")
local io = require("io")
local os = require("os")
local act = wezterm.action

local function setup()
	local function isViProcess(pane)
		return pane:get_foreground_process_name():find("n?vim") ~= nil
	end

	local function conditionalActivatePane(window, pane, pane_direction, vim_direction)
		if isViProcess(pane) then
			window:perform_action(
				act.Multiple({
					act.SendKey({ key = "w", mods = "CTRL" }),
					act.SendKey({ key = vim_direction }),
				}),
				pane
			)
		else
			window:perform_action(act.ActivatePaneDirection(pane_direction), pane)
		end
	end

	wezterm.on("ActivatePaneDirection-right", function(window, pane)
		conditionalActivatePane(window, pane, "Right", "l")
	end)
	wezterm.on("ActivatePaneDirection-left", function(window, pane)
		conditionalActivatePane(window, pane, "Left", "h")
	end)
	wezterm.on("ActivatePaneDirection-up", function(window, pane)
		conditionalActivatePane(window, pane, "Up", "k")
	end)
	wezterm.on("ActivatePaneDirection-down", function(window, pane)
		conditionalActivatePane(window, pane, "Down", "j")
	end)

	-- Retrieve the current scrollback text and send to editor
	wezterm.on("edit-scrollback", function(window, pane)
		local viewport_text = pane:get_logical_lines_as_text(10000)

		-- Create a temporary file to pass to vim
		local name = os.tmpname()

		local f = io.open(name, "w+")
		if f == nil then
			return false
		end
		f:write(viewport_text)
		f:flush()
		f:close()

		-- Open a new window running vim and tell it to open the file
		window:perform_action(
			act.SpawnCommandInNewTab({
				args = { (os.getenv("EDITOR") or "vi"), name },
			}),
			pane
		)

		-- Wait time for vim to read the file before we remove it.
		wezterm.sleep_ms(1000)
		os.remove(name)
	end)

	wezterm.on("toggle-leader", function(window, pane)
		wezterm.log_info("toggling the leader")
		local overrides = window:get_config_overrides() or {}
		if not overrides.leader then
			wezterm.log_info("enabling leader key")
			overrides.leader = { key = "s", mods = "SUPER" }
		else
			wezterm.log_info("disabling leader key")
			overrides.leader = nil
		end

		window:set_config_overrides(overrides)
	end)

	wezterm.on("toggle-tabbar", function(window, _)
		local overrides = window:get_config_overrides() or {}
		if overrides.enable_tab_bar == false then
			wezterm.log_info("showing tab bar")
			overrides.enable_tab_bar = true
		else
			wezterm.log_info("hiding tab bar")
			overrides.enable_tab_bar = false
		end
		window:set_config_overrides(overrides)
	end)
end

return { setup = setup }
