local wezterm = require("wezterm")
local mux = wezterm.mux
local act = wezterm.action

local function font_with_fallback(name, params)
	local names = { name, "Noto Color Emoji" }
	return wezterm.font_with_fallback(names, params)
end

wezterm.on("gui-startup", function(cmd)
	local args = {}
	if cmd then
		args = cmd.args
	end

	local _, _, window = mux.spawn_window({
		workspace = "local",
		args = args,
	})
	-- spawn 10 tabs
	for _ = 1, 10 do
		window:spawn_tab({})
	end

	mux.set_active_workspace("local")
end)

wezterm.on("mux-startup", function()
	local _, _, window = mux.spawn_window({
		workspace = "dln-dev",
	})
	-- Spawn 10 mux tabs (on dev server)
	for _ = 1, 10 do
		window:spawn_tab({})
	end
end)

local is_server = wezterm.hostname() == "dln-dev"

local function activate_nvim(window, pane)
	wezterm.log_info("activate_nvim")
	for _, t in ipairs(window:mux_window():tabs_with_info()) do
		for _, p in ipairs(t.tab:panes()) do
			if p:get_title() == "nvim" then
				window:perform_action(
					act.Multiple({
						act.ActivateTab(t.index),
						act.MoveTab(0),
					}),
					pane
				)
				return
			end
		end
	end
end

wezterm.on("user-var-changed", function(window, pane, name, value)
	wezterm.log_info("user-var-changed", name, value)

	if name == "nvim_activate" then
		activate_nvim(window, pane)
	end
end)

local function activate_tab(index)
	return function(window, pane)
		window:perform_action(act.ActivateTab(index), pane)
	end
end

wezterm.on("tab-1", activate_nvim)
wezterm.on("tab-2", activate_tab(1))
wezterm.on("tab-3", activate_tab(2))
wezterm.on("tab-4", activate_tab(3))
wezterm.on("tab-5", activate_tab(4))
wezterm.on("tab-6", activate_tab(5))
wezterm.on("tab-7", activate_tab(6))
wezterm.on("tab-8", activate_tab(7))
wezterm.on("tab-9", activate_tab(8))
wezterm.on("tab-10", activate_tab(9))

wezterm.add_to_config_reload_watch_list("/home/dln/.config/shelman-theme/current/wezterm")

return {
	color_scheme = "Shelman Theme",
	color_scheme_dirs = {
		"/home/dln/.config/shelman-theme/current/wezterm",
	},
	font = font_with_fallback("Iosevka Shelman SS09", { weight = "Regular" }),
	font_rules = {
		{
			italic = false,
			intensity = "Half",
			font = font_with_fallback("Iosevka Shelman SS09", { weight = "Thin" }),
		},
		{
			italic = true,
			intensity = "Normal",
			font = font_with_fallback("Iosevka Shelman Curly Slab", { weight = "Light", italic = true }),
		},
		{
			italic = true,
			intensity = "Bold",
			font = font_with_fallback("Iosevka Shelman SS15", { weight = "ExtraLight", italic = true }),
		},
		{
			intensity = "Bold",
			font = font_with_fallback("Iosevka Shelman SS09", { weight = "DemiBold" }),
		},
	},
	front_end = "WebGpu",
	warn_about_missing_glyphs = false,
	bold_brightens_ansi_colors = false,
	allow_square_glyphs_to_overflow_width = "Always",
	font_size = 13.5,
	command_palette_font_size = 13.5,
	line_height = 1.0,
	cell_width = 0.95,
	initial_cols = 132,
	initial_rows = 45,
	use_resize_increments = true,
	window_background_opacity = 1.0,
	colors = {
		tab_bar = {
			active_tab = {
				fg_color = "#e0e0e0",
				bg_color = "#374f66",
			},
		},
	},
	default_cursor_style = "SteadyBlock",
	cursor_thickness = "3px",
	cursor_blink_rate = 0,
	enable_wayland = true,
	enable_tab_bar = false,
	tab_bar_at_bottom = true,
	use_fancy_tab_bar = true,
	show_tab_index_in_tab_bar = true,
	enable_scroll_bar = false,
	scrollback_lines = 5000,
	alternate_buffer_wheel_scroll_speed = 1,
	check_for_updates = false,
	status_update_interval = 100,
	audible_bell = "Disabled",
	term = "wezterm",
	disable_default_key_bindings = true,
	keys = {
		{ key = "c", mods = "ALT|SHIFT", action = act.CopyTo("ClipboardAndPrimarySelection") },
		{ key = "v", mods = "ALT|SHIFT", action = act.PasteFrom("Clipboard") },
		{ key = "0", mods = "CTRL", action = "ResetFontSize" },
		{ key = "-", mods = "CTRL", action = "DecreaseFontSize" },
		{ key = "=", mods = "CTRL", action = "IncreaseFontSize" },
		{ key = "Enter", mods = "ALT", action = "ToggleFullScreen" },
		{ key = "r", mods = "ALT", action = act.ReloadConfiguration },
		-- mux
		{ key = "A", mods = "ALT", action = act.AttachDomain("dln-dev") },
		{ key = "E", mods = "ALT", action = act.DetachDomain({ DomainName = "dln-dev" }) },
		{ key = "1", mods = "ALT", action = act.EmitEvent("tab-1") },
		{ key = "2", mods = "ALT", action = act.EmitEvent("tab-2") },
		{ key = "3", mods = "ALT", action = act.EmitEvent("tab-3") },
		{ key = "4", mods = "ALT", action = act.EmitEvent("tab-4") },
		{ key = "5", mods = "ALT", action = act.EmitEvent("tab-5") },
		{ key = "6", mods = "ALT", action = act.EmitEvent("tab-6") },
		{ key = "7", mods = "ALT", action = act.EmitEvent("tab-7") },
		{ key = "8", mods = "ALT", action = act.EmitEvent("tab-8") },
		{ key = "9", mods = "ALT", action = act.EmitEvent("tab-9") },
		{ key = "0", mods = "ALT", action = act.EmitEvent("tab-10") },
		{ key = "RightArrow", mods = "CTRL", action = act.ActivateTabRelative(1) },
		{ key = "LeftArrow", mods = "CTRL", action = act.ActivateTabRelative(-1) },
		{ key = "l", mods = "ALT", action = wezterm.action.ActivateCommandPalette },
		{ key = "Backspace", mods = "ALT", action = act.SwitchWorkspaceRelative(1) },
		{ key = "UpArrow", mods = "SHIFT", action = act.ScrollByLine(-1) },
		{ key = "DownArrow", mods = "SHIFT", action = act.ScrollByLine(1) },
		{ key = "PageUp", mods = "SHIFT", action = act.ScrollByPage(-0.5) },
		{ key = "PageDown", mods = "SHIFT", action = act.ScrollByPage(0.5) },
	},
	mouse_bindings = {
		{
			event = { Down = { streak = 1, button = { WheelUp = 1 } } },
			mods = "SHIFT",
			action = act.ScrollByLine(-1),
		},
		{
			event = { Down = { streak = 1, button = { WheelDown = 1 } } },
			mods = "SHIFT",
			action = act.ScrollByLine(1),
		},
		{
			event = { Down = { streak = 1, button = { WheelUp = 1 } } },
			action = act.ScrollByPage(-0.25),
		},
		{
			event = { Down = { streak = 1, button = { WheelDown = 1 } } },
			action = act.ScrollByPage(0.25),
		},
	},
	unix_domains = {
		{
			name = "dln-dev",
			local_echo_threshold_ms = 100,
			proxy_command = is_server == false and { "ssh", "dln-dev", "wezterm", "cli", "proxy" } or nil,
		},
	},
}