--          ╭─────────────────────────────────────────────────────────╮
--          │                         KEYMAPS                         │
--          ╰─────────────────────────────────────────────────────────╯

local wezterm = WEZTERM
local act = wezterm.action

-- Set up some reference values
local Chord = "SHIFT|CTRL"
local LeaderChord = "LEADER|SHIFT|CTRL"
local LeaderShift = "LEADER|SHIFT"
local LeaderCtrl = "LEADER|CTRL"

local FuzzyLaunch = "FUZZY|TABS|DOMAINS|WORKSPACES|COMMANDS|LAUNCH_MENU_ITEMS|KEY_ASSIGNMENTS"

local resurrect = wezterm.plugin.require("https://github.com/MLFlexer/resurrect.wezterm")
local tunicodes = require("plugins/tunicodes")

local opts = {
	--  ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Leader key ━━━━━━━━━━━━━━━━━━━━━━━━━━
	leader = { key = " ", mods = "CTRL", timeout_milliseconds = 1500 },
	--  ━━━━━━━━━━━━━━━━━━━━━━━━━ Global Key Mappings ━━━━━━━━━━━━━━━━━━━━━
	keys = {
		-- Close window
		{ key = "q", mods = LeaderChord, action = act.QuitApplication },
		-- Split pane
		{ key = "|", mods = LeaderShift, action = act.SplitHorizontal({ domain = "CurrentPaneDomain" }) },
		{ key = "_", mods = LeaderShift, action = act.SplitVertical({ domain = "CurrentPaneDomain" }) },

		-- Move pane
		{ key = "h", mods = Chord, action = act.ActivatePaneDirection("Left") },
		{ key = "j", mods = Chord, action = act.ActivatePaneDirection("Down") },
		{ key = "k", mods = Chord, action = act.ActivatePaneDirection("Up") },
		{ key = "l", mods = Chord, action = act.ActivatePaneDirection("Right") },
		-- Move pane to new window
		{
			key = "!",
			mods = LeaderShift,
			action = wezterm.action_callback(function(_, pane)
				pane:move_to_new_window()
			end),
		},

		-- Toggle pane zoom
		{
			key = "z",
			mods = Chord,
			action = act.TogglePaneZoomState,
		},
		{
			key = "z",
			mods = "LEADER",
			action = act.TogglePaneZoomState,
		},
		-- Reload Config
		{ key = "F5", mods = "LEADER", action = act.ReloadConfiguration },

		-- Close pane
		{ key = "q", mods = "LEADER", action = act.CloseCurrentPane({ confirm = true }) },
		{ key = "q", mods = Chord, action = act.CloseCurrentPane({ confirm = true }) },

		-- Resize pane
		{ key = "h", mods = "ALT", action = act.AdjustPaneSize({ "Left", 1 }) },
		{ key = "j", mods = "ALT", action = act.AdjustPaneSize({ "Down", 1 }) },
		{ key = "k", mods = "ALT", action = act.AdjustPaneSize({ "Up", 1 }) },
		{ key = "l", mods = "ALT", action = act.AdjustPaneSize({ "Right", 1 }) },
		-- Resize pane mode
		{ key = "r", mods = "LEADER", action = act.ActivateKeyTable({ name = "resize_mode", one_shot = false }) },
		{ key = "p", mods = "LEADER", action = act.ActivateKeyTable({ name = "window_mode", one_shot = false }) },

		-- Tab Manipulation
		{ key = "PageUp", mods = "CTRL", action = act.ActivateTabRelative(1) },
		{ key = "PageUp", mods = Chord, action = act.MoveTabRelative(1) },
		{ key = "PageDown", mods = "CTRL", action = act.ActivateTabRelative(-1) },
		{ key = "PageDown", mods = Chord, action = act.MoveTabRelative(-1) },

		{ -- Quick launch
			key = "x",
			mods = LeaderCtrl,
			action = act.ShowLauncherArgs({
				title = "Quick Launch",
				flags = FuzzyLaunch,
			}),
		},

		-- Search
		{ key = "f", mods = "LEADER", action = act.Search("CurrentSelectionOrEmptyString") },
		{ key = "f", mods = Chord, action = act.Search("CurrentSelectionOrEmptyString") },

		-- Miscellaneous
		{ key = "a", mods = LeaderCtrl, action = act.SendKey({ key = "a", mods = "CTRL" }) },
		{ key = ";", mods = "CTRL", action = act.ActivateCommandPalette },
		{ key = "F1", mods = "LEADER", action = act.ShowDebugOverlay },
		{
			key = "u",
			mods = LeaderCtrl,
			action = act.AttachDomain("SSH:aws-discord"),
		},
		{
			key = "s",
			mods = LeaderCtrl,
			action = act.ShowLauncherArgs({ title = "Connect to SSH server", flags = "FUZZY|DOMAINS" }),
		},
		{ key = "z", mods = LeaderCtrl, action = act.TogglePaneZoomState },
		{ key = "n", mods = LeaderCtrl, action = act.SpawnWindow },
		{ key = "x", mods = "LEADER", action = act.ActivateCopyMode },

		-- Naming
		{ -- Rename [W]orkspace
			key = "w",
			mods = LeaderCtrl,
			action = act.PromptInputLine({
				description = "Enter new name for the workspace:",
				action = wezterm.action_callback(function(window, _, line)
					if line then
						wezterm.mux.rename_workspace(window:active_workspace(), line)
					end
				end),
			}),
		},
		{ -- Rename [T]ab
			key = "t",
			mods = LeaderCtrl,
			action = act.PromptInputLine({
				description = "Enter new name for the tab:",
				action = wezterm.action_callback(function(_, pane, line)
					if line then
						local tab = pane:tab()
						---@diagnostic disable-next-line: need-check-nil
						tab:set_title(line)
					end
				end),
			}),
		},
		{ -- Save [w]orkspace State
			key = "w",
			mods = "ALT",
			action = wezterm.action_callback(function()
				resurrect.save_state(resurrect.workspace_state.get_workspace_state())
			end),
		},
		{ -- Save [W]indow State
			key = "W",
			mods = "ALT",
			action = resurrect.window_state.save_window_action(),
		},
		{ -- [S]ave Session
			key = "s",
			mods = "ALT",
			action = act.Multiple({
				wezterm.action_callback(function(_, _)
					resurrect.save_state(resurrect.workspace_state.get_workspace_state())
					resurrect.window_state.save_window_action()
				end),
			}),
		},
		{ -- [R]estore Session
			key = "r",
			mods = "ALT",
			action = wezterm.action_callback(function(win, pane)
				resurrect.fuzzy_load(win, pane, function(id)
					local type = string.match(id, "^([^/]+)") -- match before '/'
					id = string.match(id, "([^/]+)$") -- match after '/'
					id = string.match(id, "(.+)%..+$") -- remove file extension
					local state
					if type == "workspace" then
						state = resurrect.load_state(id, "workspace")
						resurrect.workspace_state.restore_workspace(state, {
							relative = true,
							restore_text = true,
							on_pane_restore = resurrect.tab_state.default_on_pane_restore,
						})
					elseif type == "window" then
						state = resurrect.load_state(id, "window")
						resurrect.window_state.restore_window(pane:window(), state, {
							relative = true,
							restore_text = true,
							on_pane_restore = resurrect.tab_state.default_on_pane_restore,
							-- uncomment this line to use active tab when restoring
							-- tab = win:active_tab(),
						})
					end
				end)
			end),
		},
		{ -- [.] Insert Unicode and Emoji symbols
			key = ".",
			mods = LeaderCtrl,
			action = tunicodes.DefaultAction,
		},
	},

	--  ━━━━━━━━━━━━━━━━━━━━━━ Conditional Key Mappings ━━━━━━━━━━━━━━━━━━━
	key_tables = {
		resize_mode = { ---------- Resize Pane Mode -------------------------
			{ key = "LeftArrow", action = act.AdjustPaneSize({ "Left", 1 }) },
			{ key = "h", action = act.AdjustPaneSize({ "Left", 1 }) },

			{ key = "RightArrow", action = act.AdjustPaneSize({ "Right", 1 }) },
			{ key = "l", action = act.AdjustPaneSize({ "Right", 1 }) },

			{ key = "UpArrow", action = act.AdjustPaneSize({ "Up", 1 }) },
			{ key = "k", action = act.AdjustPaneSize({ "Up", 1 }) },

			{ key = "DownArrow", action = act.AdjustPaneSize({ "Down", 1 }) },
			{ key = "j", action = act.AdjustPaneSize({ "Down", 1 }) },

			-- Cancel the mode by pressing escape
			{ key = "Escape", action = "PopKeyTable" },
		},
		window_mode = { --------- Activate Pane Mode ----------------------
			{ key = "LeftArrow", action = act.ActivatePaneDirection("Left") },
			{ key = "h", action = act.ActivatePaneDirection("Left") },

			{ key = "RightArrow", action = act.ActivatePaneDirection("Right") },
			{ key = "l", action = act.ActivatePaneDirection("Right") },

			{ key = "UpArrow", action = act.ActivatePaneDirection("Up") },
			{ key = "k", action = act.ActivatePaneDirection("Up") },

			{ key = "DownArrow", action = act.ActivatePaneDirection("Down") },
			{ key = "j", action = act.ActivatePaneDirection("Down") },
		},
	},

	--  ━━━━━━━━━━━━━━━━━━━━━━━━━━━ Mouse Bindings ━━━━━━━━━━━━━━━━━━━━━━━━
	mouse_bindings = {
		{ -- Left-Click: (Up) Select Text
			event = { Up = { streak = 1, button = "Left" } },
			mods = "NONE",
			action = act.CompleteSelection("ClipboardAndPrimarySelection"),
		},
		{ -- Ctrl+Left-Click: (Up) Open Hyperlink
			event = { Up = { streak = 1, button = "Left" } },
			mods = "CTRL",
			action = act.OpenLinkAtMouseCursor,
		},
		{ -- Ctrl+WheelUp: Go to previous tab
			event = { Down = { streak = 1, button = { WheelUp = 1 } } },
			mods = "CTRL",
			action = act.ActivateTabRelative(-1),
		},
		{ -- Ctrl+WheelDown: Go to next tab
			event = { Down = { streak = 1, button = { WheelDown = 1 } } },
			mods = "CTRL",
			action = act.ActivateTabRelative(1),
		},
	},
}

return opts
