local gears = require("gears")
local awful = require("awful")
local hotkeys_popup = require("awful.hotkeys_popup")

require "bindings.mod"
require "config.apps"

globalkeys =
    gears.table.join(
        awful.key(
            {modkey},
            "s",
            hotkeys_popup.show_help,
            {description = "show help", group = "awesome"}
        ),
        awful.key(
            {modkey, "Control"},
            "r",
            awesome.restart,
            {description = "reload awesome", group = "awesome"}
        ),
        awful.key(
            {modkey, "Control"},
            "e",
            function()
                awful.spawn("/home/nick/.config/rofi/launchers/text/powermenu.sh", false)
            end,
            {description = "quit awesome", group = "awesome"}
        ),
        awful.key(
            {modkey},
            "j",
            function()
                awful.client.focus.byidx(1)
            end,
            {description = "focus next by index", group = "client"}
        ),
        awful.key(
            {modkey},
            "h",
            function()
                awful.client.focus.byidx(-1)
            end,
            {description = "focus previous by index", group = "client"}
        ),
        awful.key(
            {modkey},
            "u",
            awful.client.urgent.jumpto,
            {description = "jump to urgent client", group = "client"}
        ),
        awful.key(
            {modkey},
            "Tab",
            function()
                awful.client.focus.history.previous()
                if client.focus then
                    client.focus:raise()
                end
            end,
            {description = "go back", group = "client"}
        ),
        awful.key(
            {modkey, "Control"},
            "n",
            function()
                local c = awful.client.restore()
                -- Focus restored client
                if c then
                    c:emit_signal("request::activate", "key.unminimize", {raise = true})
                end
            end,
            {description = "restore minimized", group = "client"}
        ),
        awful.key(
            {},
            "XF86MonBrightnessUp",
            function()
                awful.spawn("brightness_up", false)
            end,
            {description = "brightness +5%", group = "hotkeys"}
        ),
        awful.key(
            {},
            "XF86MonBrightnessDown",
            function()
                awful.spawn("brightness_down", false)
            end,
            {description = "brightness -5%", group = "hotkeys"}
        ),
        awful.key(
            {},
            "XF86AudioRaiseVolume",
            function()
                awful.spawn("amixer set Master 2%+", false)
            end,
            {description = "volume +2%", group = "hotkeys"}
        ),
        awful.key(
            {},
            "XF86AudioLowerVolume",
            function()
                awful.spawn("amixer set Master 2%-", false)
            end,
            {description = "volume -2%", group = "hotkeys"}
        ),
        awful.key(
            {},
            "XF86AudioMute",
            function()
                awful.spawn("amixer set Master toggle", false)
            end,
            {description = "volume toggle", group = "hotkeys"}
        ),
        awful.key(
            {},
            "XF86AudioPlay",
            function()
                awful.spawn("playerctl play-pause", false)
            end,
            {description = "media toggle", group = "hotkeys"}
        ),
        awful.key(
            {},
            "XF86AudioStop",
            function()
                awful.spawn("playerctl stop", false)
            end,
            {description = "media stop", group = "hotkeys"}
        ),
        awful.key(
            {},
            "XF86AudioNext",
            function()
                awful.spawn("playerctl next", false)
            end,
            {description = "media next", group = "hotkeys"}
        ),
        awful.key(
            {},
            "XF86AudioPrev",
            function()
                awful.spawn("playerctl previous", false)
            end,
            {description = "media previous", group = "hotkeys"}
        ),
        awful.key(
            {},
            "Print",
            function ()
                awful.spawn("scrot '/home/nick/Pictures/screenshots/%Y-%m-%d-%H%M%S.png' -e 'xclip -selection clipboard -t image/png -i $f'", false)
            end,
        {description = "screenshot", group = "hotkeys"}
        ),
        awful.key(
            {"Shift"},
            "Print",
            function ()
                awful.spawn("scrot '/home/nick/Pictures/screenshots/%Y-%m-%d-%H%M%S.png' -s -f -e 'xclip -selection clipboard -t image/png -i $f'", false)
            end,
        {description = "screenshot with selection", group = "hotkeys"}
        ),
        awful.key(
            {},
            "XF86Calculator",
            function()
                awful.spawn("qalculate-gtk", false)
            end,
        {description = "calculator", group = "hotkeys"}
        ),
        awful.key(
            {modkey, "Control"},
            "p",
            function()
                awful.spawn.with_shell("power_saving_mode", false)
            end,
        {description = "toggle power saving mode", group = "hotkeys"}
        ),
        awful.key(
            {modkey},
            "t",
            function()
                awful.spawn("/home/nick/.config/awesome/scripts/switch_theme.sh", false)
            end,
            {description = "switch theme", group = "hotkeys"}
        ),
        awful.key(
            {modkey},
            "Return",
            function()
                awful.spawn(terminal)
            end,
            {description = "open a terminal", group = "launcher"}
        ),
        awful.key(
            {modkey},
            "r",
            function()
                awful.spawn("/home/nick/.config/rofi/launchers/text/launcher.sh")
            end,
            {description = "run prompt", group = "launcher"}
        ),
        awful.key(
            {modkey},
            "l",
            function()
                awful.tag.incmwfact(0.05)
            end,
            {description = "increase master width factor", group = "layout"}
        ),
        awful.key(
            {modkey},
            "k",
            function()
                awful.tag.incmwfact(-0.05)
            end,
            {description = "decrease master width factor", group = "layout"}
        ),
        awful.key(
            {modkey, "Shift"},
            "h",
            function()
                awful.tag.incnmaster(1, nil, true)
            end,
            {description = "increase the number of master clients", group = "layout"}
        ),
        awful.key(
            {modkey, "Shift"},
            "l",
            function()
                awful.tag.incnmaster(-1, nil, true)
            end,
            {description = "decrease the number of master clients", group = "layout"}
        ),
        awful.key(
            {modkey, "Control"},
            "h",
            function()
                awful.tag.incncol(1, nil, true)
            end,
            {description = "increase the number of columns", group = "layout"}
        ),
        awful.key(
            {modkey, "Control"},
            "l",
            function()
                awful.tag.incncol(-1, nil, true)
            end,
            {description = "decrease the number of columns", group = "layout"}
        ),
        awful.key(
            {modkey},
            "space",
            function()
                awful.layout.inc(1)
            end,
            {description = "select next", group = "layout"}
        ),
        awful.key(
            {modkey, "Shift"},
            "space",
            function()
                awful.layout.inc(-1)
            end,
            {description = "select previous", group = "layout"}
        ),
        awful.key(
            {modkey, "Control"},
            "j",
            function()
                awful.screen.focus_relative(1)
            end,
            {description = "focus the next screen", group = "screen"}
        ),
        awful.key(
            {modkey, "Control"},
            "k",
            function()
                awful.screen.focus_relative(-1)
            end,
            {description = "focus the previous screen", group = "screen"}
        ),
        awful.key(
            {modkey},
            "Left",
            awful.tag.viewprev,
            {description = "view previous", group = "tag"}
        ),
        awful.key(
            {modkey},
            "Right",
            awful.tag.viewnext,
            {description = "view next", group = "tag"}
        ),
        awful.key(
            {modkey},
            "Escape",
            awful.tag.history.restore,
            {description = "go back", group = "tag"}
        )
    )

for i = 1, 9 do
    globalkeys =
        gears.table.join(
            globalkeys,
            -- View tag only.
            awful.key(
                {modkey},
                "#" .. i + 9,
                function()
                    local screen = awful.screen.focused()
                    local tag = screen.tags[i]
                    if tag then
                        tag:view_only()
                    end
                end,
                {description = "view tag #" .. i, group = "tag"}
            ),
            -- Toggle tag display.
            awful.key(
                {modkey, "Control"},
                "#" .. i + 9,
                function()
                    local screen = awful.screen.focused()
                    local tag = screen.tags[i]
                    if tag then
                        awful.tag.viewtoggle(tag)
                    end
                end,
                {description = "toggle tag #" .. i, group = "tag"}
            ),
            -- Move client to tag.
            awful.key(
                {modkey, "Shift"},
                "#" .. i + 9,
                function()
                    if client.focus then
                        local tag = client.focus.screen.tags[i]
                        if tag then
                            client.focus:move_to_tag(tag)
                        end
                    end
                end,
                {description = "move focused client to tag #" .. i, group = "tag"}
            ),
            -- Toggle tag on focused client.
            awful.key(
                {modkey, "Control", "Shift"},
                "#" .. i + 9,
                function()
                    if client.focus then
                        local tag = client.focus.screen.tags[i]
                        if tag then
                            client.focus:toggle_tag(tag)
                        end
                    end
                end,
                {description = "toggle focused client on tag #" .. i, group = "tag"}
            )
        )
end

root.keys(globalkeys)
