--       █████╗ ██╗    ██╗███████╗███████╗ ██████╗ ███╗   ███╗███████╗
--      ██╔══██╗██║    ██║██╔════╝██╔════╝██╔═══██╗████╗ ████║██╔════╝
--      ███████║██║ █╗ ██║█████╗  ███████╗██║   ██║██╔████╔██║█████╗
--      ██╔══██║██║███╗██║██╔══╝  ╚════██║██║   ██║██║╚██╔╝██║██╔══╝
--      ██║  ██║╚███╔███╔╝███████╗███████║╚██████╔╝██║ ╚═╝ ██║███████╗
--      ╚═╝  ╚═╝ ╚══╝╚══╝ ╚══════╝╚══════╝ ╚═════╝ ╚═╝     ╚═╝╚══════╝


-- Standard awesome libraries
local gears = require("gears")
local awful = require("awful")


-- ===================================================================
-- User Configuration
-- ===================================================================


-- define default apps (global variable so other components can access it)
apps = {
    terminal = 'bash -c "WINIT_X11_SCALE_FACTOR=1 alacritty"',
    launcher = "/home/user/.toggle_rofi.sh",
    screenshot = "scrot -e 'mv $f ~/Pictures/Screenshots/ 2>/dev/null'",
}

-- List of apps to run on start-up
local run_on_start_up = {
     "numlockx on",
     "nm-applet",
     "xcape -e \"Super_L=Super_L|XF86Launch5\" -t 5000",
     "xmodmap /home/user/.Xmodmap",
     os.getenv("XDG_CONFIG_HOME") .. "/awesome/scripts/setup_display.sh"
}

-- ===================================================================
-- Initialization
-- ===================================================================


-- Import notification appearance
require("components.notifications")

-- Run all the apps listed in run_on_start_up
for _, app in ipairs(run_on_start_up) do
    local findme = app
    local firstspace = app:find(" ")
    if firstspace then
        findme = app:sub(0, firstspace - 1)
    end
    -- pipe commands to bash to allow command to be shell agnostic
    awful.spawn.with_shell(string.format("echo 'pgrep -u $USER -x %s > /dev/null || (%s)' | bash -", findme, app), false)
end

-- Import theme
local beautiful = require("beautiful")
beautiful.init(gears.filesystem.get_configuration_dir() .. "theme.lua")

-- Initialize theme
local selected_theme = require("pastel")
selected_theme.initialize()

-- Import Keybinds
local keys = require("keys")
root.keys(keys.globalkeys)
root.buttons(keys.desktopbuttons)

-- Import rules
local create_rules = require("rules").create
awful.rules.rules = create_rules(keys.clientkeys, keys.clientbuttons)

-- Define layouts
awful.layout.layouts = {
     awful.layout.suit.tile,
     awful.layout.suit.floating,
     awful.layout.suit.fair,
     awful.layout.suit.fair.horizontal,
     awful.layout.suit.tile.left,
     awful.layout.suit.tile.bottom,
     awful.layout.suit.tile.top,
}

-- Signal function to execute when a new client appears.
client.connect_signal("manage", function (c)
    -- Set the window as a slave (put it at the end of others instead of setting it as master)
    if not awesome.startup then
        awful.client.setslave(c)
    end

    if awesome.startup and not c.size_hints.user_position and not c.size_hints.program_position then
        -- Prevent clients from being unreachable after screen count changes.
        awful.placement.no_offscreen(c)
    end
    gears.timer.delayed_call(function() awful.placement.centered(mouse, {parent=c}) end)
end)


-- ===================================================================
-- Client Focusing
-- ===================================================================


-- Autofocus a new client when previously focused one is closed
require("awful.autofocus")

-- Focus clients under mouse
client.connect_signal("mouse::enter", function(c)
    c:emit_signal("request::activate", "mouse_enter", {raise = false})
end)

-- ===================================================================
-- Screen Change Functions (ie multi monitor)
-- ===================================================================


-- Reload config when screen geometry changes
screen.connect_signal("property::geometry", awesome.restart)


-- ===================================================================
-- Garbage collection (allows for lower memory consumption)
-- ===================================================================


collectgarbage("setpause", 110)
collectgarbage("setstepmul", 1000)

require("awesomewm-vim-tmux-navigator") {
     up = {"Up", "k"},
     down = {"Down", "j"},
     left = {"Left", "h"},
     right = {"Right", "l"},
     mod = "Mod4",
     mod_keysym = "Super_L",
     experimental = true
}

client.connect_signal("property::maximized", function(focused)
     local hide = focused.maximized or focused.fullscreen
     for i, c in ipairs(client.get()) do
         if not c.floating and c.screen == focused.screen and c.first_tag == focused.first_tag then
             c.minimized = hide
         end
     end

     focused.minimized = false
end)

client.connect_signal("unmanage", function(unmanaged)
    if unmanaged.maximized then
        for i, c in ipairs(client.get()) do
            if not c.floating and c.screen == unmanaged.screen then
                c.minimized = false
            end
        end
    end
end)

client.connect_signal("focus", function(c)
  c.border_color = beautiful.border_focus
end)

client.connect_signal("unfocus", function(c)
  c.border_color = beautiful.border_normal
end)