{-# LANGUAGE BlockArguments #-}

import Control.Monad (forM_, join)
import Data.Function ((&))
import System.Environment
import System.Process
import XMonad
import XMonad.Actions.SpawnOn
import XMonad.Config
import XMonad.Config.Kde
import XMonad.Hooks.EwmhDesktops (ewmh, fullscreenEventHook)
import XMonad.Hooks.ManageDocks
import XMonad.Layout.NoBorders
import XMonad.Layout.Spacing
import XMonad.Layout.ThreeColumns
import XMonad.Operations
import XMonad.Util.EZConfig

kdeOn :: Bool
kdeOn = False

-- startingConfig = if kdeOn then kdeConfig else defaultConfig

main =
  xmonad $
    ewmh $
      docks $
        def
          { modMask = mod4Mask,
            layoutHook = myLayoutHook,
            startupHook = startup,
            manageHook = manageDocks <+> manageSpawn <+> myManagerHook <+> manageHook kdeConfig,
            handleEventHook = handleEventHook kdeConfig <+> fullscreenEventHook,
            terminal = myTerminal,
            workspaces = myWorkspaces,
            borderWidth = 5,
            focusedBorderColor = "#4c4f69",
            normalBorderColor = "#4c4f69"
          }
          `additionalKeysP` keymap
  where
    myWorkspaces =
      ["1:dev", "2:browser", "3:chat", "4:reading", "5", "6"]

    appWorkspaceConfig =
      [ (3, "Discord"),
        (4, "alacritty"),
        (2, "google-chrome-stable")
      ]

    manageWorkspaces =
      appWorkspaceConfig
        & fmap \(workspaceId, name) -> do
          let workspaceName = myWorkspaces !! (workspaceId - 1)
          className =? name --> doShift workspaceName

    kdeFloats =
      [ "yakuake",
        "Yakuake",
        "Kmix",
        "kmix",
        "plasma",
        "Plasma",
        "plasma-desktop",
        "Plasma-desktop",
        "krunner",
        "ksplashsimple",
        "ksplashqml",
        "ksplashx"
      ]

    floatKdeStuff = [className =? name --> doFloat | name <- kdeFloats]

    myManagerHook =
      composeAll $
        concat
          [ if kdeOn then floatKdeStuff else [],
            manageWorkspaces
          ]

    myTerminal = "alacritty"
    myBrowser = "google-chrome-stable"

    -- TODO: find a way to bind all the program-opening-keybindings to a single sub-map
    keymap =
      [ ("M-p", spawn "rofi -show drun"),
        ("M-w", spawn "rofi -show window"),
        ("M-g", spawn myBrowser),
        ("M-d", spawn "Discord"),
        ("M-v", spawn "alacritty -e vimclip"),
        ("M-s", spawn "spectacle -rcb"),
        ("M-S-s", spawn "spectacle -mcb"),
        ("M-C-s", spawn "spectacle -ucb"),
        ("M-c", kill)
      ]

    uniformBorder = join $ join $ join Border
    border = uniformBorder 0
    spacingHook = spacingRaw False border False border True

    tall = Tall 1 (3 / 100) (1 / 2)
    threeCols = ThreeCol 1 (3 / 100) (1 / 2)

    layouts = tall ||| threeCols ||| Full
    myLayoutHook = desktopLayoutModifiers $ spacingHook layouts

    startupApps =
      [ (0, "alacritty"),
        (1, "google-chrome-stable"),
        (2, "Discord")
      ]

    startup :: X ()
    startup = do
      forM_ startupApps \(index, app) -> do
        spawnOn (myWorkspaces !! index) app