(define-module (oni home data config)
  #:use-module (gnu home)
  #:use-module (gnu home services)
  #:use-module (gnu home services shells)
  #:use-module (gnu home services desktop)
  #:use-module (gnu services)
  #:use-module (gnu packages)
  #:use-module (gnu packages admin)
  #:use-module (gnu packages shellutils)
  #:use-module (gnu packages wm)
  #:use-module (guix gexp)
  #:use-module (oni home services xdisorg)
  #:use-module (oni home services xmodmap)
  #:use-module (oni home services kitty)
  #:use-module (oni home services xsession)
  #:use-module (oni home services compton)
  #:use-module (oni home services xbindkeys)
  #:use-module (oni home services zsh)
  #:use-module (oni home services herbstluftwm)
  #:use-module (oni home services polybar)
  #:use-module (oni home services kdeconnect)
  #:use-module (oni home services cmst)
  #:use-module (oni home services syncthing))

(home-environment
 (packages (list (specification->package+output "glibc-locales")
                 (specification->package+output "font-fantasque-sans")
                 (specification->package+output "font-comic-neue")))

 (services
  (list
   (simple-service 'some-useful-env-vars-service
                   home-environment-variables-service-type
                   `(("LESS" . "FXRSi")
                     ("MY_GUIX_CONFIGURED" . "1")
                     ("DOTNET_CLI_TELEMETRY_OPTOUT" . "1")
                     ("EDITOR" . "emacsclient")
                     ("CALIBRE_USE_DARK_PALETTE" . "1")
                     ("GUIX_LOCPATH" . "$HOME/.guix-home/profile/lib/locale")))

   (service home-redshift-service-type
            (home-redshift-configuration
             (location-provider 'manual)
             (latitude 49.2127205)
             (longitude 122.9267927)))

   (service home-zsh-service-type
            (home-zsh-configuration
             (environment-variables
              '(("HISTFILE" . "$HOME/.zsh/histfile")
                ("HISTSIZE" . "1000")
                ("SAVEHIST" . "1000")))
             (zshrc
              (list
               (mixed-text-file
                "zshrc"
                "fpath=($HOME/.zsh/functions $fpath)\n"
                "autoload -U $HOME/.zsh/functions/*(:t)\n"
                "alias csi=\"rlwrap csi\"\n"
                "alias scsh=\"rlwrap scsh\"\n"
                "alias sbcl=\"rlwrap sbcl\"\n"
                "alias hc=herbstclient\n"
                "setopt SHARE_HISTORY\n"
                "setopt HIST_IGNORE_ALL_DUPS\n"
                "zle -N x-copy-region-as-kill\n"
                "zle -N x-kill-region\n"
                "zle -N x-yank\n"
                "bindkey -e '^[w' x-copy-region-as-kill\n"
                "bindkey -e '^W' x-kill-region\n"
                "bindkey -e '^Y' x-yank\n"
                "autoload -Uz compinit\n"
                "compinit\n")))))

   ;; This has to be the first extension because it needs to be added to the
   ;; configuration last.
   (service home-zsh-syntax-highlighting-service-type)
   (service home-zsh-autosuggestions-service-type)

   (service home-rofi-service-type
            (home-rofi-configuration
             (config
              '((kb-cancel . "Escape,Control+g")
                (window-format . "{c}  {t}")))
             (theme
              '((* ((text-color . "#bfbfbf")
                    (background-color . "#3f4242")
                    (lightbg . "#5b6161")
                    (red . "#a85454")
                    (orange . "#faa41a")
                    (blue . "#1f2c3f")

                    (selected-normal-foreground . "@foreground")
                    (normal-foreground . "@foreground")
                    (alternate-normal-background . "@background")
                    (selected-urgent-foreground . "@foreground")
                    (urgent-foreground . "@foreground")
                    (alternate-urgent-background . "@background")
                    (active-foreground . "@text-color")
                    (selected-active-foreground . "@foreground")
                    (alternate-normal-foreground . "@foreground")
                    (alternate-active-background . "@blue")
                    (bordercolor . "@foreground")
                    (normal-background . "@background")
                    (selected-normal-background . "@blue")
                    (separatorcolor . "@orange")
                    (spacing . 2)
                    (urgent-background . "@red")
                    (alternate-urgent-foreground . "@foreground")
                    (selected-urgent-background . "@red")
                    (alternate-active-foreground . "@foreground")
                    (selected-active-background . "@blue")
                    (active-background . "@red")

                    (font . "Fantasque Sans Mono 14")))
                (window ((border . 0)
                         (text-color . "@foreground")
                         (background-color . "rgba(0, 0, 0, 0%)")
                         (padding . 5)
                         (text-color . "@bordercolor")
                         (background-color . "@background")))
                (mainbox ((border . 0)
                          (padding . 0)))
                (message ((border . "1px dash 0px 0px")
                          (text-color . "@separatorcolor")
                          (padding . "2px 0px 0px")))
                (textbox ((text-color . "@foreground")))
                (listview ((fixed-height . 0)
                           (border . "2px 0px 0px")
                           (padding . "2px 0px 0px")
                           (text-color . "@separatorcolor")))
                (element ((border . 0)
                          (children "element-icon" "element-text")
                          (spacing . "5px")))
                (element-text
                 element-icon ((background-color . "inherit")
                               (text-color . "inherit")))
                (element.normal.normal ((text-color . "@normal-foreground")
                                        (background-color . "@normal-background")))
                (element.normal.urgent ((text-color . "@urgent-foreground")
                                        (background-color . "@urgent-background")))
                (element.normal.active ((text-color . "@active-foreground")
                                        (background-color . "@active-background")))
                (element.selected.normal ((text-color . "@selected-normal-foreground")
                                          (background-color . "@selected-normal-background")))
                (element.selected.urgent ((text-color . "@selected-urgent-foreground")
                                          (background-color . "@selected-urgent-background")))
                (element.selected.active ((text-color . "@selected-active-foreground")
                                          (background-color . "@selected-active-foreground")))
                (element.alternate.normal ((text-color . "@alternate-normal-foreground")
                                           (background-color . "@alternate-normal-background")))
                (element.alternate.urgent ((text-color . "@alternate-urgent-foreground")
                                           (background-color . "@alternate-urgent-background")))
                (element.alternate.active ((text-color . "@alternate-active-foreground")
                                           (background-color . "@alternate-active-background")))
                (mode-switcher ((border . "1px dash 0px 0px")))
                (#{button selected}# ((text-color . "@selected-normal-foreground")
                                      (background-color . "@selected-normal-background")))
                (inputbar ((spacing . 0)
                           (border . "0px")
                           (children "prompt" "textbox-prompt-colon" "entry" "case-indicator")))
                (#{button normal}# ((text-color . "@foreground")))
                (text-prompt-color ((expand . #f)
                                    (str . ":")
                                    (margin . "0px 0.3em 0em 0em")
                                    (text-color . "@normal-foreground")))))))

   (service home-xmodmap-service-type
            (home-xmodmap-configuration
             (pointer '(3 2 1))
             (extra '("remove Mod5 = ISO_Level3_Shift"
                      "keycode 108 = Alt_L"
                      "add Mod1 = Alt_L"))))

   (service home-kitty-service-type
            (home-kitty-configuration
             (configuration
              '((font-family . "Fantasque Sans Mono")
                (bold-font . "Fantasque Sans Mono Bold")
                (italic-font . "Fantasque Sans Mono Italic")
                (bold-italic-font . "Fantasque Sans Mono Bold Italic")
                (font-size . 14)
                (symbol-map . "U+f002 Font Awesome 5 Free Solid")
                (cursor-shape . beam)
                (cursor-blink-interval . 0)
                (url-style . single)
                (open-url-with . firefox)
                (copy-on-select . #f)
                (enable-audio-bell . #f)
                (visual-bell-duration . 0)
                (window-padding-width . 11.25)
                (active-tab-font-style . normal)
                (editor . emacsclient)
                (allow-remote-control . #t)
                (enabled-layouts vertical stack tall fat grid horizontal)
                (cursor . "#969696")
                (url-color . "#a88654")
                (active-border-color . "#1f2c3f")
                (inactive-border-color . "#3d3d3d")
                (bell-border-color . "#3f1a1a")
                (active-tab-foreground . "#65a854")
                (active-tab-background . "#1f2c3f")
                (inactive-tab-foreground . "#65a854")
                (inactive-tab-background . "#3d3d3d")
                (foreground . "#bfbfbf")
                (background . "#222424")
                (selection-foreground . "#bfbfbf")
                (selection-background . "#1f2c3f")
                (color0 . "#222222")
                (color8 . "#3d3d3d")
                (color1 . "#3f1a1a")
                (color9 . "#da9d9d")
                (color2 . "#65a854")
                (color10 . "#a9d39e")
                (color3 . "#8d995c")
                (color11 . "#c2ca9e")
                (color4 . "#5476a8")
                (color12 . "#a2b8b8")
                (color5 . "#9754a8")
                (color13 . "#d0a8da")
                (color6 . "#54a8a8")
                (color14 . "#abdddd")
                (color7 . "#969696")
                (color15 . "#ededed")))))

   (service home-xsession-service-type
            (home-xsession-configuration
             (configuration
              (list
               (mixed-text-file
                "xsession"
                "xrdb -cpp m4 -merge \"${HOME}/.config/X11/Xresources\" -I\"${HOME}/.config/X11/Xresources.d\"\n"
                "xrandr --setprovideroutputsource modesetting NVIDIA-0\n"
                "xrandr --auto\n"
                "xrandr --dpi 96\n")))))

   (service home-picom-service-type
            (home-picom-configuration
             (config
              '((detect-transient . #t)
                (shadow . #t)
                (wintypes ((dnd ((shadow . #f)))
                           (dock ((shadow . #f)))))
                (shadow-radius . 10)
                (shadow-exclude ("name = 'mowedline'"
                                 "class_g = 'trayer'"
                                 "bounding_shaped"))))))

   (service home-xbindkeys-service-type
            (home-xbindkeys-configuration
             (keybindings
              '(((mod4 shift q) . "herbstclient quit")
                ((mod4 shift e) . "herbstclient reload")
                ((mod4 k) . "hersbtclient close")
                ((mod4 mod1 k) . "herbstclient remove")
                ((mod4 Return) . "herbstclient spawn kitty")
                ((mod4 t) . "herbstclient spawn hlwm-run-or-raise \"\\(URxct\\|Hyper\\|kitty\\)\" kitty")
                ((mod4 b) . "herbstclient spawn hlwm-run-or-raise \"\\(Conkeror\\|[Ff]irefox\\|Chromium\\|Next\\|qutebrowser\\)\" firefox")
                ((mod4 e) . "herbstclient spawn hlwm-run-or-raise Emacs emacsclient --create-frame")
                ((control mod1 l) . "herbstclient spawn i3lock")
                ((mod4 x) . "herbstclient spawn hlwm-switch-tags")
                ((mod4 shift b) . "herbstclient shift left")
                ((mod4 shift n) . "herbstclient shift down")
                ((mod4 shift p) . "herbstclient shift up")
                ((mod4 shift f) . "herbstclient shift right")
                ((mod4 control b) . "herbstclient resize left +0.05")
                ((mod4 control n) . "herbstclient resize down +0.05")
                ((mod4 control p) . "herbstclient resize up +0.05")
                ((mod4 control f) . "herbstclient resize right +0.05")
                ((mod4 shift underscore) . "herbstclient split bottom 0.5")
                ((mod4 shift bar) . "herbstclient split right 0.5")
                ((mod4 period) . "herbstclient use_index +1 --skip-visible")
                ((mod4 comma) . "herbstclient use_index -1 --skip-visible")
                ((mod4 shift control f) . "herbstclient floating toggle")
                ((mod4 f) . "herbstclient cycle_layout 1 vertical max")
                ((mod4 m) . "herbstclient fullscreen toggle")
                ((mod4 p) . "herbstclient pseudotile toggle")
                ((mod4 space) . "herbstclient or , and . compare tags.focus.curframe_wcount = 2 . cycle_layout +1 vertical horizontal max vertical grid , cycle_layout +1")
                ((mod4 BackSpace) . "herbstclient cycle_monitor")
                ((mod4 u) . "herbstclient jumpto urgent")
                ((XF86AudioPlay) . "herbstclient spawn mpc toggle")
                ((XF86AudioNext) . "herbstclient spawn mpc next")
                ((XF86AudioPrev) . "herbstclient spawn mpc prev")
                ((mod4 r) . "herbstclient spawn rofi -show run")
                ((mod4 w) . "herbstclient spawn rofi -show window -window-command \"/home/chelys/usr/bin/hlwm-switch-to-window {window}\"")
                ((mod4 c)
                 ("1" . "herbstclient move_index 0")
                 ("2" . "herbstclient move_index 1")
                 ("3" . "herbstclient move_index 2")
                 ("4" . "herbstclient move_index 3")
                 ("5" . "herbstclient move_index 4")
                 ("6" . "herbstclient move_index 5")
                 ("7" . "herbstclient move_index 6")
                 ("8" . "herbstclient move_index 7")
                 ("9" . "herbstclient move_index 8")
                 ("0" . "herbstclient move_index 9"))
                ((mod4 s)
                 ("f" . "flameshot full ~/pictures/screenshots/")
                 ("c" . "flameshot gui"))))))

   (service home-herbstluftwm-service-type
            (home-herbstluftwm-configuration
             (tags '(dev web game))
             (mouse-bindings
              '(("Mod4-Button1" . "move")
                ("Mod4-Button2" . "zoom")
                ("Mod4-Button3" . "resize")))
             (settings
              '((default_frame_layout . 2)
                (frame_border_active_color . "#3d3d3d")
                (frame_border_normal_color . "#222222")
                (frame_bg_normal_color . "#111111")
                (frame_bg_active_color . "#263f1f")
                (frame_border_width . 0)
                (window_border_width . 2)
                (window_border_inner_width . 0)
                (window_border_normal_color . "#222222")
                (window_border_active_color . "#1f3f3f")
                (window_border_inner_color . "#111111")
                (always_show_frame . 0)
                (frame_gap . 30)
                (window_gap . 30)
                (frame_padding . -30)
                (frame_bg_transparent . 1)
                (smart_window_surroundings . 0)
                (smart_frame_surroundings . 0)
                (mouse_recenter_gap . 0)
                (swap_monitors_to_get_tag . 0)
                (update_dragged_clients . 1)
                (tree_style . "╾│ ├└╼─┐")))
             (attributes
              '(((theme tiling reset) . 1)
                ((theme floating reset) . 1)))
             (rules
              '(("focus=on")
                ("class=Emacs" "tag=dev" "index=01" "switchtag=on" "hook=emacs")
                ("class~'URxvt|kitty'" "tag=dev" "index=1" "switchtag=on" "hook=urxvt")
                ("class~'Conkeror|[Ff]irefox|Chromium'" "tag=dev" "index=00" "switchtag=on")
                ("class=Pinentry" "pseudotile=on")
                ("class=Alsaplayer" "pseudotile=on")
                ("class=Gcr-prompter" "pseudotile=on")
                ("class=Steam" "title='Steam Login'" "pseudotile=on")
                ("class=Steam" "title~'Steam - News .*'" "pseudotile=on")
                ("class=" "title=Steam" "pseudotile=on")
                ("class=xfreerdp" "floating=on" "tag=work" "index=0" "switchtag=on")
                ("windowtype~'_NET_WM_WINDOW_TYPE_(DIALOG|UTILITY|SPLASH)'" "pseudotile=on")
                ("windowtype='_NET_WM_WINDOW_TYPE_DIALOG'" "focus=on")
                ("windowtype~'_NET_WM_WINDOW_TYPE_(NOTIFICATION|DOCK|DESKTOP)'" "manage=off")
                ("class=pinball.exe" "pseudotile=on")))
             (padding '(0 0 0 16 16))
             (layouts
              '((web clients max:0)
                (dev split horizontal:0.54:1 (clients max:0) (clients vertical:0))))
             (extra
              (list
               "set_monitors 1920x1080+0+0"
               "focus_edge left"
               "keybind Mod4-r spawn rofi -show run"
               "keybind Mod4-w spawn rofi -show window -window-command \"$HOME/usr/bin/hlwm-switch-to-window {window}\""
               "keybind Mod4-apostrophe spawn dunstctl close"
               "keybind Mod4-quotedbl spawn dunstctl close-all"
               "keybind Mod4-Control-apostrophe spawn dunstctl history-pop"
               "keybind Mod4-Mod1-apostrophe spawn dunstctl context"))))

   (service home-polybar-service-type
            (home-polybar-configuration
             (bar "data")))

   (service home-kdeconnect-service-type)

   (service home-cmst-service-type)

   (service home-syncthing-service-type))))