;;; $DOOMDIR/config.el -*- lexical-binding: t; -*-

(defun load-directory (dir)
  (let ((load-it (lambda (f) (load-file (concat (file-name-as-directory dir) f)))))
    (mapc load-it (directory-files dir nil "\\.el$"))))

(defun org-path-find-file ()
  "Open org-path in find file"
  (interactive)
  (doom-project-find-file +user-org-path))

(defun org-path (filename)
  "Expand filename relative to the default org-path"
  (expand-file-name filename +user-org-path))

(defun my-org-inline-css-hook (exporter)
  "Insert custom inline css"
  (when (eq exporter 'html)
    (let* ((dir (ignore-errors (file-name-directory (buffer-file-name))))
           (path (concat dir "style.css"))
           (fallback-style (or (null dir) (null (file-exists-p path))))
           (final (if fallback-style "~/.config/doom/style.css" path))) ;; <- set your own style file path
      (setq org-html-head-include-default-style t)
      (setq org-html-head (concat
                           "<style type=\"text/css\">\n"
                           "<!--/*--><![CDATA[/*><!--*/\n"
                           (with-temp-buffer
                             (insert-file-contents final)
                             (buffer-string))
                           "/*]]>*/-->\n"
                           "</style>\n")))))

(defun my-weebery-is-always-greater ()
  (let* ((banner '("EMACS                                "
                   "███▄ ▄███▓ ▒█████   ▒█████  ▓█████▄  "
                   "▓██▒▀█▀ ██▒▒██▒  ██▒▒██▒  ██▒▒██▀ ██▌"
                   "▓██    ▓██░▒██░  ██▒▒██░  ██▒░██   █▌"
                   "▒██    ▒██ ▒██   ██░▒██   ██░░▓█▄   ▌"
                   "▒██▒   ░██▒░ ████▓▒░░ ████▓▒░░▒████▓ "
                   "░ ▒░   ░  ░░ ▒░▒░▒░ ░ ▒░▒░▒░  ▒▒▓  ▒ "
                   "░  ░      ░  ░ ▒ ▒░   ░ ▒ ▒░  ░ ▒  ▒ "
                   "░      ░   ░ ░ ░ ▒  ░ ░ ░ ▒   ░ ░  ░ "
                   "       ░       ░ ░      ░ ░     ░    "
                   "                              ░      "))
         (longest-line (apply #'max (mapcar #'length banner))))
    (put-text-property
     (point)
     (dolist (line banner (point))
       (insert (+doom-dashboard--center
                +doom-dashboard--width
                (concat line (make-string (max 0 (- longest-line (length line))) 32)))
               "\n"))
     'face 'doom-dashboard-banner)))

(map! "C-M-+" #'doom/increase-font-size)
(map! "C-#" #'comment-line)

(map! :leader
      :map doom-leader-file-map
      :desc "Find org files" "f o" #'org-path-find-file)

(map! :leader
      :map doom-leader-open-map
      :desc "Open elfeed" "o e" #'elfeed
      :desc "Open org drill" "o r" #'org-drill)

(map! :localleader
      :after org
      :map org-mode-map
      :desc "View habit stats" "g s" #'org-habit-stats-view-habit-at-point)


;; Basic User Settings
(setq user-full-name "Jonathan Jenne"
      user-mail-address "johnnie@posteo.de")

;; Set backend for finding auth credentials
(setq auth-sources
      '("~/.authinfo" "~/.authinfo.gpg" "~/.netrc"))

(load-directory "~/.config/doom/lisp")


;; Default Shell
;; Useful if default system shell is not bash
(setq shell-file-name (executable-find "bash"))

;; This is where all org files are sourced from
(setq +user-org-path "~/Notes/Org")

;; Display Line numbers
(setq display-line-numbers-type t)

;; Fonts
(setq doom-font
      (font-spec :family "IBM Plex Mono" :size 18 :weight 'medium))
(setq doom-variable-pitch-font
      (font-spec :family "IBM Plex Serif" :size 18 :weight 'medium))
(setq variable-pitch
      (font-spec :family "IBM Plex Serif" :size 18 :weight 'medium))

;; Dashboard
(setq +doom-dashboard-ascii-banner-fn #'my-weebery-is-always-greater)
(remove-hook '+doom-dashboard-functions #'doom-dashboard-widget-shortmenu)
(remove-hook '+doom-dashboard-functions #'doom-dashboard-widget-footer)
(remove-hook '+doom-dashboard-functions #'doom-dashboard-widget-loaded)

(use-package! notmuch
  :config
  (setq +notmuch-sync-backend 'offlineimap
        +notmuch-home-function (lambda () (notmuch-search "tag:inbox"))
        message-send-mail-function 'smtpmail-send-it
        smtpmail-default-smtp-server "posteo.de"
        smtpmail-stream-type 'ssl
        smtpmail-smtp-service 465))


;; Org Mode
(use-package! org
  :config
  (setq ;; General
   org-directory +user-org-path
   org-log-into-drawer "LOGBOOK"
   org-src-tab-acts-natively t

   ;; Org Export
   org-export-exclude-tags '("toc")

   ;; Org Agenda
   org-agenda-show-all-dates t
   org-agenda-span 2
   org-agenda-start-day "+0d"
   org-agenda-tag-filter-preset '("-drill")

   ;; Disable timegrid since it causes errors on current org-mode 9.7
   ;; when org-super-agenda is also used
   ;; See: https://github.com/alphapapa/org-super-agenda/issues/247
   ;; See: https://git.savannah.gnu.org/cgit/emacs/org-mode.git/commit/?id=fac55324accbcab08dfebbde8295b2f1b4b9f45e
   org-agenda-use-time-grid nil

   org-agenda-time-grid
   '((daily today require-timed)
     (800 1000 1200 1400 1600 1800 2000)
     " ┄┄┄┄┄ " "┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄")
   org-agenda-current-time-string
   "◀── now ──────────────────────────────────────────────── \\o/"
   org-agenda-block-separator ?─
   ;; Consider all org files part of the org-agenda
   org-agenda-files (list +user-org-path)
   ;; org-agenda-spillover-skip-function '(org-agenda-skip-entry-if 'todo 'done)

   ;; Org Todo
   org-todo-keywords
   '((sequence "TODO(t)" "DOING(g)" "WAIT(w)" "|" "DONE(d)" "CANCEL(c)")
     (sequence "THIS(T)" "EXAMPLE")
     (sequence "[ ]" "[?]" "|" "[x]"))

   ;; Org Capture
   +org-capture-notes-file (org-path "Notes.org")
   +org-capture-todo-file (org-path "Todo.org")
   +org-capture-journal-file (org-path "Journal.org")
   +org-capture-cooking-file (org-path "Cooking.org")
   +org-capture-nepali-file (org-path "Nepali.org")
   org-capture-templates
   '(("t" "Personal Todo" entry
      (file +org-capture-todo-file)
      "* TODO %^{Todo Item}" :prepend t :immediate-finish t)

     ("n" "Nepali")
     ("nw" "Nepali Word" entry
      (file+headline +org-capture-nepali-file "Nepali Words")
      "* %^{Nepali Word} :drill:\n%\\1\n** Answer\n%^{Translation}" :prepend t :immediate-finish t)

     ("s" "Shopping Item" entry
      (file +org-capture-todo-file)
      "* TODO %^{Shopping Item} :shopping:" :prepend t :immediate-finish t)

     ("j" "Daily Journal" entry
      (file+olp+datetree +org-capture-journal-file)
      "* %U %?\n" :prepend t)

     ("r" "Recipe" entry
      (file+headline +org-capture-cooking-file "Unsorted")
      "* NEVERMADE %?
:PROPERTIES:
:Author:
:Source:
:Sent_by:
:Yield:
:Prep_Time:
:Cook_Time:
:Total_Time:
:Cost:
:Description:
:URL:
:Added: %u
:END:

- [ ] Ingredient 1


1. First Step")))


  :hook (org-after-todo-state-change . org-habit-stats-update-properties)
  :init
  (add-to-list 'org-modules 'org-habit)
  (add-hook 'org-export-before-processing-functions 'my-org-inline-css-hook))

(use-package! drag-stuff
  :init (drag-stuff-global-mode t))

(use-package! elfeed
  :config
  (evil-define-key 'normal elfeed-show-mode-map
    (kbd "J") 'elfeed-goodies/split-show-next
    (kbd "K") 'elfeed-goodies/split-show-prev)
  (evil-define-key 'normal elfeed-search-mode-map
    (kbd "J") 'elfeed-goodies/split-show-next
    (kbd "K") 'elfeed-goodies/split-show-prev)
  :config
  (setq elfeed-goodies/entry-pane-size 0.5
        elfeed-search-filter "@2-week-ago +unread +unread"
        elfeed-feeds
        '(("https://adactio.com/journal/rss" tech)
          ("https://andregarzia.com/feeds/all.atom.xml" tech)
          ("https://ar.al/index.xml" tech activism)
          ("https://archlinux.org/feeds/news/" tech linux)
          ("https://ashfurrow.com/feed.xml" health)
          ("https://bachrauf.org/feed/" activism)
          ("https://beko.famkos.net/feed/" tech)
          ("https://blog.elementary.io/feed.xml" tech release)
          ("https://blog.gls.de/feed/" finances)
          ("https://dasklima.podigee.io/feed/mp3" podcast)
          ("https://forgefriends.org/index.xml" tech)
          ("https://forgejo.org/rss.xml" release tech)
          ("https://github.com/InfiniTimeOrg/InfiniTime/releases.atom" github release)
          ("https://github.com/actualbudget/actual/releases.atom" github release)
          ("https://github.com/ceciliamay/obsidianmd-theme-primary/releases.atom" github release)
          ("https://github.com/dani-garcia/vaultwarden/releases.atom" github release)
          ("https://github.com/extrawurst/gitui/releases.atom" github release)
          ("https://github.com/microg/GmsCore/releases.atom" github release)
          ("https://github.com/noatpad/obsidian-banners/releases.atom" github release)
          ("https://github.com/superseriousbusiness/gotosocial/releases.atom" github release)
          ("https://grimgrains.com/links/rss.xml" food)
          ("https://jlelse.blog/.rss" tech)
          ("https://katapult-magazin.de/feed/rss" activism)
          ("https://katja-diehl.de/feed/" activism)
          ("https://kevquirk.com/feed" tech)
          ("https://maudb.gitlab.io/dok/rss.xml" food autonomy)
          ("https://miniflux.app/feed.xml" tech release)
          ("https://mntre.com/reform_md.atom" tech)
          ("https://nesslabs.com/feed" productivity)
          ("https://newsfeed.zeit.de/serie/die-kaenguru-comics" comics)
          ("https://nicolevanderhoeven.com/index.xml" tech)
          ("https://noyb.eu/en/rss" activism)
          ("https://nullprogram.com/feed/" tech)
          ("https://obsidian.md/feed.xml" tech release)
          ("https://ohhelloana.blog/feed.xml" tech)
          ("https://pluralistic.net/feed/" tech activism)
          ("https://shkspr.mobi/blog/feed/" tech)
          ("https://smallstar.space/feed/" religion)
          ("https://snikket.org/blog/index.xml" tech release)
          ("https://solar.lowtechmagazine.com/posts/index.xml" tech sustainability)
          ("https://theoatmeal.com/feed/rss" comics)
          ("https://victoria.dev/atom.xml" tech)
          ("https://warandpeas.com/feed/" comics)
          ("https://warnung.bund.de/api31/mowas/rss/065310000000.rss" alerts)
          ("https://webcomicname.com/rss" comics)
          ("https://webdevlaw.uk/feed/" tech activism)
          ("https://www.commitstrip.com/en/feed/" comics)
          ("https://www.drugsandwires.fail/feed/" )
          ("https://www.kuketz-blog.de/category/artikel/feed/" tech)
          ("https://www.kuketz-blog.de/category/microblog/feed/" tech)
          ("https://www.mein-nepal.de/feed/" nepal)
          ("https://www.oglaf.com/feeds/rss/" comics nsfw)
          ("https://www.schoenescheisse.de/feed/" comics)
          ("https://www.smbc-comics.com/comic/rss" comics)
          ("https://www.tomorrow.one/de-DE/feed.xml" sustainability finances)
          ("https://www.volksverpetzer.de/feed/" activism)
          ("https://www.wetell.de/feed/" service sustainability)
          ("https://www.youtube.com/feeds/videos.xml?channel_id=UC0e3QhIYukixgh5VVpKHH9Q" youtube)
          ("https://www.youtube.com/feeds/videos.xml?channel_id=UCCJ-NJtqLQRxuaxHZA9q6zg" youtube)
          ("https://www.youtube.com/feeds/videos.xml?channel_id=UClZbO3wehSIsPUKLx_X5caw" youtube)
          ("https://www.youtube.com/feeds/videos.xml?channel_id=UCtUbO6rBht0daVIOGML3c8w" youtube)
          ("https://www.youtube.com/feeds/videos.xml?channel_id=UCyNtlmLB73-7gtlBz00XOQQ" youtube)
          ("https://www.youtube.com/feeds/videos.xml?channel_id=UCzg5UMJ62uoKHTkq5bgkp5g" youtube)
          ("https://zerforschung.org/index.xml" activism))))

(use-package! expand-region
  :bind ("C-ä" . er/expand-region))

(use-package! heaven-and-hell
  :ensure t
  :config
  (setq heaven-and-hell-theme-type 'dark ;; Omit to use light by default
        heaven-and-hell-themes
        '((light . modus-operandi)
          (dark . modus-vivendi)) ;; Themes can be the list: (dark . (tsdh-dark wombat))
        heaven-and-hell-load-theme-no-confirm t)
  :hook (after-init . heaven-and-hell-init-hook)
  :bind (("<f6>" . heaven-and-hell-toggle-theme)))

(use-package! hl-todo
  :config
  (setq hl-todo-keyword-faces
        '(("TODO" warning bold)
          ("EXAMPLE" font-lock-keyword-face bold)
          ("HACK" font-lock-constant-face bold)
          ("DEPRECATED" font-lock-doc-face bold)
          ("NOTE" success bold)
          ("BUG" error bold)
          ("THIS" font-lock-constant-face bold)))
  :hook (org-mode . hl-todo-mode))

(use-package! nov
  :mode ("\\.epub\\'" . nov-mode)
  :config
  (setq nov-text-width 70))

(use-package! olivetti
  :init
  (add-hook! 'nov-mode-hook 'olivetti-mode)
  (add-hook! 'org-mode-hook
             '(olivetti-mode
               (lambda () (display-line-numbers-mode -1)))))

(use-package! org-auto-tangle
  :defer t
  :config (setq org-auto-tangle-default nil)
  :hook (org-mode . org-auto-tangle-mode))

(use-package! org-caldav
  :config
  (setq auth-source-debug t
        org-caldav-url "https://posteo.de:8443/calendars/johnnie"
        org-caldav-calendar-id "default"
        org-caldav-inbox (org-path "Calendar.org")
        org-caldav-files nil
        org-caldav-days-in-past 7
        org-caldav-delete-calendar-entries 'never
        org-icalendar-timezone "Europe/Berlin"))

(use-package! org-drill
  :config
  (setq org-drill-scope 'agenda))

(use-package! org-noter
  :config
  (setq org-noter-notes-search-path '("~/Notes/Org")
        org-noter-always-create-frame nil
        org-noter-doc-split-fraction '(0.75 . 0.75)
        org-noter-default-notes-file-names '()))

(use-package! org-roam
  :config
  (setq org-roam-directory "~/Notes/Org/Roam"
        org-roam-dailies-directory "Daily"))

(use-package! org-superstar
  :hook
  (org-mode . (lambda () (org-superstar-mode 1))))


(use-package! org-super-agenda
  :config
  (setq org-super-agenda-groups
        '(;; Each group has an implicit boolean OR operator between its selectors.
          (:name "Important"
           ;; Single arguments given alone
           ;;:tag "bills"
           :priority "A")
          (:name "Habits"
           :habit t)

          (:name "Appointments"
           :file-path "Calendar\.org")

          (:name "Inbox"
           :file-path "Inbox\.org")

          (:name "Shopping"
           :tag "shopping")
          ;; Set order of multiple groups at once
          (:priority<= "B"
           ;; Show this section after "Today" and "Important", because
           ;; their order is unspecified, defaulting to 0. Sections
           ;; are displayed lowest-number-first.
           :order 1)
          ;; After the last group, the agenda will display items that didn't
          ;; match any of these groups, with the default order position of 99
          ))
  :init
  (org-super-agenda-mode t))

(use-package! casual
  :init
  (require 'casual)
  (define-key calc-mode-map (kbd "C-o") 'casual-main-menu))
