(define-module (oni home config rincewind)
  #:use-module ((gnu home)
                #:select (home-environment))
  #:use-module ((gnu home services mail)
                #:select (home-msmtp-service-type
                          home-msmtp-configuration
                          msmtp-configuration
                          msmtp-account))
  #:use-module ((gnu home services gnupg)
                #:select (home-gpg-agent-service-type
                          home-gpg-agent-configuration))
  #:use-module ((gnu home services ssh)
                #:select (home-ssh-agent-service-type))
  #:use-module ((gnu packages certs)
                #:select (nss-certs))
  #:use-module ((gnu packages cdrom)
                #:select (abcde))
  #:use-module ((gnu packages databases)
                #:select (recutils
                          emacs-rec-mode))
  #:use-module ((gnu packages emacs)
                #:select (emacs-next-tree-sitter))
  #:use-module ((gnu packages emacs-xyz)
                #:select (emacs-org-roam
                          emacs-guix
                          emacs-org-contacts
                          emacs-fennel-mode))
  #:use-module ((gnu packages file-systems)
                #:select (tmsu))
  #:use-module ((gnu packages forth)
                #:select (gforth))
  #:use-module ((gnu packages gnome)
                #:select (hicolor-icon-theme))
  #:use-module ((gnu packages librewolf)
                #:select (librewolf))
  #:use-module ((gnu packages linux)
                #:select (fakeroot))
  #:use-module ((gnu packages mail)
                #:select (notmuch
                          emacs-notmuch))
  #:use-module ((gnu packages music)
                #:select (easytag))
  #:use-module ((gnu packages tree-sitter)
                #:select (tree-sitter-bash
                          tree-sitter-scheme
                          tree-sitter-python
                          tree-sitter-org
                          tree-sitter-json
                          tree-sitter-css))
  #:use-module ((gnu packages)
                #:select (specification->package+output
                          specification->package))
  #:use-module ((gnu services)
                #:select (service
                          simple-service))
  #:use-module ((guix channels)
                #:select (channel
                          make-channel-introduction
                          openpgp-fingerprint))
  #:use-module ((guix gexp)
                #:select (local-file
                          mixed-text-file))
  #:use-module ((guix packages)
                #:select (package-name
                          package-input-rewriting))
  #:use-module ((guix transformations)
                #:select (options->transformation))
  #:use-module ((nongnu packages emacs)
                #:select (emacs-org-roam-ui))
  #:use-module ((oni home config common)
                #:select (home-redshift-service
                          ;; home-xbindkeys-service
                          home-zsh-service
                          home-guile-service
                          home-xmodmap-service
                          home-openssh-service
                          home-kitty-service
                          home-channels-service))
  #:use-module ((oni home services autokey)
                #:select (home-autokey-service-type))
  #:use-module ((oni home services copyq)
                #:select (home-copyq-service-type))
  #:use-module ((oni home services dunst)
                #:select (home-dunst-default-service))
  #:use-module ((oni home services emacs)
                #:select (home-emacs-service-type
                          home-emacs-configuration
                          home-emacs-helpful-service-type
                          home-emacs-helpful-configuration
                          home-emacs-yasnippet-capf-service-type
                          home-emacs-dashboard-service-type
                          home-emacs-dashboard-configuration
                          home-emacs-eros-service-type
                          home-emacs-ace-link-service-type
                          home-emacs-ace-link-configuration
                          home-emacs-ace-link-notmuch-service-type
                          home-emacs-ace-link-notmuch-configuration
                          home-emacs-golden-ratio-service-type
                          home-emacs-pinentry-service-type
                          home-emacs-vterm-service-type
                          home-emacs-vterm-configuration
                          home-emacs-org-modern-service-type
                          home-wakatime-service-type
                          home-wakatime-configuration))
  #:use-module ((oni home services environment)
                #:select (home-environment-service))
  #:use-module ((oni home services flameshot)
                #:select (home-flameshot-service-type))
  #:use-module ((oni home services gnuzilla)
                #:select (home-icecat-service-type
                          home-icecat-configuration))
  #:use-module ((oni home services kdeconnect)
                #:select (home-kdeconnect-service-type))
  #:use-module ((oni home services mpd)
                #:select (home-mpd-service-type
                          home-mpd-configuration
                          <home-mpd-audio-output>
                          home-mpc-update-service-type
                          home-mpd-notify-service-type
                          home-mpdscrobble-service-type))
  #:use-module ((oni home services mpv)
                #:select (home-mpv-service-type
                          home-mpv-mpris-service-type))
  #:use-module ((oni home services notmuch)
                #:select (home-notmuch-service-type
                          home-notmuch-configuration))
  #:use-module ((oni home services picom)
                #:select (home-picom-service-type
                          home-picom-configuration))
  #:use-module ((oni home services polybar)
                #:select (home-polybar-service-type
                          home-polybar-configuration))
  #:use-module ((oni home services rofi)
                #:select (home-rofi-default-service))
  #:use-module ((oni home services stumpwm)
                #:select (home-stumpwm-service-type
                          home-stumpwm-configuration
                          home-stumpwm-gaps-service-type
                          home-stumpwm-gaps-configuration
                          home-stumpwm-stumptray-service-type
                          home-stumpwm-stumptray-configuration))
  #:use-module ((oni home services syncthing)
                #:select (home-syncthing-service-type))
  #:use-module ((oni home services utilities)
                #:select (home-inkplate-display-service-type))
  #:use-module ((oni home services zsh)
                #:select (home-zsh-syntax-highlighting-service-type
                          home-zsh-autosuggestions-service-type
                          home-zsh-autopair-service-type))
  #:use-module ((oni packages count-emails)
                #:select (count-emails))
  #:use-module ((oni packages emacs)
                #:select (emacs-inkplate
                          emacs-outli
                          emacs-syncthing-status
                          emacs-nginx-mode))
  #:use-module ((oni packages emacs-config)
                #:select (emacs-oni-org-roam
                          emacs-oni-elfeed
                          emacs-oni-elisp
                          emacs-oni-eshell
                          emacs-oni-core
                          emacs-oni-compilation
                          emacs-oni-common-lisp
                          emacs-oni-gui
                          emacs-oni-magit
                          emacs-oni-notmuch
                          emacs-oni-hy
                          emacs-oni-project
                          emacs-oni-bookmark
                          emacs-oni-dired
                          emacs-oni-browse-url
                          emacs-oni-c
                          emacs-oni-circe
                          emacs-oni-clojure
                          emacs-oni-cmake
                          emacs-oni-conf
                          emacs-oni-cpp
                          emacs-oni-csharp
                          emacs-oni-css
                          emacs-oni-diff-hl
                          emacs-oni-ediff
                          emacs-oni-elm
                          emacs-oni-emms
                          emacs-oni-epub
                          emacs-oni-eww
                          emacs-oni-grep
                          emacs-oni-haskell
                          emacs-oni-highlight-indent-guides
                          emacs-oni-html
                          emacs-oni-java
                          emacs-oni-json
                          emacs-oni-log-edit
                          emacs-oni-lua
                          emacs-oni-makefile
                          emacs-oni-nxml
                          emacs-oni-package
                          emacs-oni-projectile
                          emacs-oni-scheme
                          emacs-oni-sh
                          emacs-oni-shr
                          emacs-oni-tramp
                          emacs-oni-embrace
                          emacs-oni-yaml
                          emacs-oni-python
                          emacs-oni-git-commit
                          emacs-oni-php
                          emacs-oni-web-mode))
  #:use-module ((oni packages inbox-size)
                #:select (inbox-size))
  #:use-module ((oni packages mpd)
                #:select (mpd-random-albums))
  #:use-module ((oni packages notmuch-collect-tasks)
                #:select (notmuch-collect-tasks))
  #:use-module ((oni packages notmuch-tag-mailinglists)
                #:select (notmuch-tag-mailinglists))
  #:use-module ((oni packages pick-random-wallpaper)
                #:select (pick-random-wallpaper))
  #:use-module ((oni packages shutdown-rofi)
                #:select (shutdown-rofi))
  #:use-module ((oni packages snes-games)
                #:select (snes-blackthorne
                          snes-blackthorne-icons))
  #:use-module ((oni packages stumpwm)
                #:select (stumpwm+swank))
  #:use-module ((oni packages terminals)
                #:select (tym))
  #:use-module ((oop goops)
                #:select (make)))

(define (with-master-branch package)
  "Apply a transformation to PACKAGE so that it uses the master branch."
  ((options->transformation
    `((with-branch . ,(string-append (package-name package) "=master"))))
   package))

(define (with-source package source)
  ((options->transformation
    `((with-source . ,(format #f "~a=~a" (package-name package) source))))
   package))

(define rincewind-picom-service
  (service home-picom-service-type
           (home-picom-configuration
            (backend "glx")
            (glx-no-stencil #t)
            (detect-transient #t)
            (shadow #t)
            (shadow-radius 5)
            (shadow-opacity 85)
            (shadow-offset-x 15)
            (shadow-offset-y 15)
            (shadow-exclude
             '("name = 'mowedline'"
               "class_g = 'trayer'"
               "bounding_shaped"
               "class_g = 'i3lock'"))
            (wintypes
             '((dnd (shadow . #f))
               (dock (shadow . #f))))
            (rounded-corners-exclude
             '("window_type *= \\\"dock\\\""))
            (corner-radius 15)
            (blur-background #f)
            (blur-background-frame #f)
            (fading #f))))

(define my-emacs emacs-next-tree-sitter)

(home-environment
 (packages (list easytag
                 (specification->package+output "glibc-locales")
                 (specification->package+output "font-fantasque-sans")
                 (specification->package+output "font-comic-neue")
                 (specification->package+output "font-dosis")
                 (specification->package "zathura")
                 (specification->package "zathura-ps")
                 (specification->package "zathura-pdf-mupdf")
                 pick-random-wallpaper
                 notmuch-collect-tasks
                 notmuch-tag-mailinglists
                 (inbox-size my-emacs)
                 count-emails
                 shutdown-rofi
                 emacs-org-roam
                 emacs-org-roam-ui
                 emacs-org-contacts
                 fakeroot               ; Needed for build arch packages
                 tmsu
                 mpd-random-albums
                 notmuch
                 emacs-inkplate
                 emacs-syncthing-status
                 emacs-outli
                 emacs-guix
                 emacs-fennel-mode

                 (emacs-oni-org-roam my-emacs)
                 emacs-oni-elisp
                 emacs-oni-core
                 emacs-oni-elfeed
                 emacs-oni-eshell
                 emacs-oni-compilation
                 emacs-oni-common-lisp
                 emacs-oni-gui
                 emacs-oni-magit
                 emacs-oni-notmuch
                 emacs-oni-hy
                 emacs-oni-project
                 emacs-oni-bookmark
                 emacs-oni-dired
                 emacs-oni-browse-url
                 emacs-oni-c
                 emacs-oni-circe
                 emacs-oni-clojure
                 emacs-oni-cmake
                 emacs-oni-conf
                 emacs-oni-cpp
                 emacs-oni-csharp
                 emacs-oni-css
                 emacs-oni-diff-hl
                 emacs-oni-ediff
                 emacs-oni-elm
                 emacs-oni-embrace
                 emacs-oni-emms
                 emacs-oni-epub
                 emacs-oni-eww
                 emacs-oni-grep
                 emacs-oni-haskell
                 emacs-oni-highlight-indent-guides
                 emacs-oni-html
                 emacs-oni-java
                 emacs-oni-json
                 emacs-oni-log-edit
                 emacs-oni-lua
                 emacs-oni-makefile
                 emacs-oni-nxml
                 emacs-oni-package
                 emacs-oni-projectile
                 emacs-oni-scheme
                 emacs-oni-sh
                 emacs-oni-shr
                 emacs-oni-tramp
                 emacs-oni-yaml
                 emacs-oni-python
                 emacs-nginx-mode
                 emacs-oni-git-commit
                 emacs-oni-php
                 emacs-oni-web-mode

                 tree-sitter-bash
                 tree-sitter-scheme
                 tree-sitter-python
                 tree-sitter-org
                 tree-sitter-json
                 tree-sitter-css
                 gforth
                 recutils
                 emacs-rec-mode
                 ;; Might be needed for certain icons?
                 hicolor-icon-theme
                 ;; Might be needed for cetrificates
                 nss-certs

                 tym

                 (with-source snes-blackthorne-icons
                              (format #f "~a/pictures/icons/Blackthorne/blackthorne_icons.tar.gz" (getenv "HOME")))
                 (with-source snes-blackthorne
                              (format #f "~a/downloads/Blackthorne.7z" (getenv "HOME")))))

 (services
  (list
   home-environment-service
   home-rofi-default-service
   home-dunst-default-service
   home-redshift-service
   ;; home-xbindkeys-service
   home-zsh-service
   home-guile-service
   home-xmodmap-service
   home-openssh-service
   home-kitty-service
   rincewind-picom-service

   ;; 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-zsh-autopair-service-type)

   home-channels-service

   ;; (service home-polybar-service-type
   ;;          (home-polybar-configuration
   ;;           (bar "rincewind")))

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

   (service home-emacs-service-type
            (home-emacs-configuration
             (package my-emacs)
             (configurations
              (list
               (local-file "../services/emacs/init.el")
               (mixed-text-file
                "init.el"
                "(with-eval-after-load 'hy-mode (require 'oni-hy))\n"
                "(with-eval-after-load 'project (require 'oni-project))\n"
                "(projectile-mode)\n"
                "(setq custom-file \"~/.config/emacs/custom.el\")\n"
                "(load custom-file)\n"
                "(provide 'init)\n"
                ";;; init.el ends here\n")))))
   (service home-emacs-helpful-service-type
            (home-emacs-helpful-configuration
             (configurations
              (list
               (local-file "../services/emacs/oni-helpful.el")))))
   (service home-emacs-yasnippet-capf-service-type)
   (service home-emacs-dashboard-service-type
            (home-emacs-dashboard-configuration
             (configurations
              (list
               (local-file "../services/emacs/oni-dashboard.el")))))
   (service home-emacs-eros-service-type)
   (service home-emacs-ace-link-service-type
            (home-emacs-ace-link-configuration
             (default-key "C-S-e")
             (goto-address-key "C-S-e")
             (org-mode-key "C-S-e")))
   (service home-emacs-ace-link-notmuch-service-type
            (home-emacs-ace-link-notmuch-configuration
             (default-key "C-S-e")))
   (service home-emacs-golden-ratio-service-type)
   (service home-emacs-pinentry-service-type)
   (service home-emacs-vterm-service-type
            (home-emacs-vterm-configuration
             (buffer-name-string "*vterm* %s")))
   (service home-emacs-org-modern-service-type)
   (service home-wakatime-service-type
            (home-wakatime-configuration
             (api-url "https://waka.ryuslash.org/api")
             (exclude '("COMMIT_EDITMSG$"
                        "TAG_EDITMSG$"))))

   (service home-flameshot-service-type)

   (service home-mpd-service-type
            (home-mpd-configuration
             (music-directory "~/music")
             (playlist-directory "~/music/playlists")
             (log-file "~/.local/share/mpd/mpd.log")
             (pid-file "~/.local/share/mpd/mpd.pid")
             (db-file "~/.local/share/mpd/mpd.db")
             (state-file "~/.local/share/mpd/mpdstate")
             (audio-outputs
              (list (make <home-mpd-audio-output> #:type "pulse" #:name "MPD Pulse")
                    (make <home-mpd-audio-output>
                      #:type "fifo"
                      #:name "Visualizer"
                      #:path "/tmp/mpd.fifo"
                      #:format "44100:16:2")))))
   (service home-mpc-update-service-type)
   (service home-mpd-notify-service-type)
   (service home-mpdscrobble-service-type)

   (service home-mpv-service-type)
   ;; [2024-01-05 Fri] mpv-mpris fails to compile:
   ;;    mpris.c:1:10: fatal error: gio/gio.h: No such file or directory
   ;; Since I don't actually use it right now I really don't need it.
   ; (service home-mpv-mpris-service-type)

   (service home-stumpwm-service-type
            (home-stumpwm-configuration
             (package stumpwm+swank)
             (configurations
              (list (local-file "../services/stumpwm/config")))))
   (service home-stumpwm-gaps-service-type
            (home-stumpwm-gaps-configuration
             (configurations
              (list (local-file "../services/stumpwm/config-gaps")))))
   (service home-stumpwm-stumptray-service-type
            (home-stumpwm-stumptray-configuration
             (configurations
              (list (mixed-text-file "config-stumptray"
                                     "(require 'stumptray)\n"
                                     "(stumptray::stumptray)\n")))))

   (service home-inkplate-display-service-type)
   (service home-notmuch-service-type
            (home-notmuch-configuration
             (database-path "/home/chelys/documents/mail")
             (user-primary-email "tom@ryuslash.org")
             (user-other-email '("ryuslash@gmail.com" "tom@iactor.nl"))
             (new-ignore '(".nnmaildir" ".mbsyncstate" ".uidvalidity"
                           ".mbsyncstate.journal" ".mbsyncstate.new"))))

   (service home-autokey-service-type)
   (service home-copyq-service-type)

   (service home-msmtp-service-type
            (home-msmtp-configuration
             (defaults (msmtp-configuration
                        (auth? #t)
                        (tls? #t)
                        (tls-starttls? #t)
                        (port 587)))
             (accounts
              (list (msmtp-account
                     (name "gmail")
                     ;; Use `secret-tool store --label=msmtp host smtp.gmail.com
                     ;; service smtp user ryuslash@gmail.com' to store the
                     ;; password.
                     (configuration (msmtp-configuration
                                     (host "smtp.gmail.com")
                                     (from "ryuslash@gmail.com")
                                     (user "ryuslash@gmail.com"))))
                    (msmtp-account
                     (name "ryuslash")
                     ;; Use `secret-tool store --label=msmtp host
                     ;; smtp-ryuslash.alwaysdata.net service smtp user
                     ;; tom@ryuslash.org' to store the password.
                     (configuration (msmtp-configuration
                                     (host "smtp-ryuslash.alwaysdata.net")
                                     (from "tom@ryuslash.org")
                                     (user "tom@ryuslash.org"))))))
             (default-account "ryuslash")))

   (service home-gpg-agent-service-type
            (home-gpg-agent-configuration
             (ssh-support? #f)
             (extra-content
              "allow-emacs-pinentry\n")))
   (service home-ssh-agent-service-type)

   (service home-icecat-service-type
            (home-icecat-configuration
             (package librewolf)
             (settings
              '(("extensions.pocket.enabled" #f)
                ("view_source.editor.args" "--no-wait")
                ("view_source.editor.external" #t)
                ("view_source.editor.path" "/home/chelys/.guix-home/profile/bin/emacsclient")
                ;; Visual modifications. Don't let websites pick the colors or
                ;; the fonts, use mine instead.
                ("browser.display.document_color_use" 2)
                ("browser.display.use_document_fonts" 0)
                ("browser.display.background_color" "#222424")
                ("browser.display.foreground_color" "#bfbfbf")
                ("browser.anchor_color" "#ff9800")
                ("browser.visited_color" "#0babab")
                ("browser.newtabpage.activity-stream.showWeather" #f)
                ("font.default.x-western" "sans-serif")
                ("font.minimum-size.x-western" 18)
                ("font.name.monospace.x-western" "Fantasque Sans Mono")
                ("font.name.sans-serif.x-western" "Dosis")
                ;; Sadly, with this option on it won't accept my color
                ;; modifications, so I turn it off, even though I would prefer
                ;; being able to leave everything (except the forced light
                ;; theme) on.
                ("privacy.resistFingerprinting" #f)
                ;; Change the accelerator key (modifier key for most keyboard
                ;; shortcuts) to the super key (from control).
                ("ui.key.accelKey" 91))))))))