#!/usr/bin/env bash
# ----------------------------------------------------------------------
#  INITIALIZE the HAMACS SYSTEM
# ----------------------------------------------------------------------

# shellcheck disable=SC2164
HAMACS_DIR=$(cd "$(dirname "$0")"; pwd)
HAMACS_DEST=$HOME/.emacs.d

cd "$HAMACS_DIR"
mkdir -p "$HAMACS_DEST"

for LINK in snippets templates elisp
do
    echo "Symlinking $HAMACS_DEST/$LINK to $HAMACS_DIR/$LINK ..."
    rm -rf "${HAMACS_DEST:-~}/$LINK"
    ln -s "$HAMACS_DIR/$LINK" "$HAMACS_DEST"
done

echo Download the public keys:
gpg --homedir ~/.emacs.d/elpa/gnupg --receive-keys 066DAFCB81E42C40

cat > "$HAMACS_DEST/early-init.el" <<EOF
;;; early-init.el --- Hamacs Early Init -*- lexical-binding: t; -*-
;;
;;; Commentary:
;;
;; This is my early Emacs configuration file. See init.el for the real
;; boot process. Since we are using straight or elpaca, we just need to
;; stop the normal package process.
;;
;;; Code:

;; Need the package system near the front:
(require 'package)

;; We'll be using straight. So, we don't want duplicated package loading:
(setq package-enable-at-startup nil)

;; While I would rather program my configurations, sometimes the Emacs
;; menu system is _good enough_, but I want it in its own file:

(setq custom-file (expand-file-name "custom.el" user-emacs-directory))
(when (file-exists-p custom-file)
  (load custom-file))

;; Let's build the \`exec-path' from the _real_ shell path:
EOF

IFS=":" read -r -a PATH_ARRAY <<< "${PATH}"
for P in "${PATH_ARRAY[@]}"
do
  echo "(add-to-list 'exec-path \"${P}\")" >> "$HAMACS_DEST/early-init.el"
done

cat >> "$HAMACS_DEST/early-init.el" <<EOF
;; Local Variables:
;; no-byte-compile: t
;; no-native-compile: t
;; no-update-autoloads: t
;; End:

;;; early-init.el ends here
EOF

echo "Created $HAMACS_DEST/early-init.el"


cat > "$HAMACS_DEST/init.el" <<EOF
;;; init.el --- Hamacs Init -*- lexical-binding: t; -*-
;;
;;; Commentary:
;;
;; This is my Emacs Bootloader. Simply put, I initialize the package
;; management system, and then tangle my literate files. This simple
;; idea came from https://github.com/susamn/dotfiles
;;
;;; Code:

(defvar hamacs-source-dir "$HAMACS_DIR" "Where we be.")

;; Bug fixes for ORG (there always seems to be something):
(defvar native-comp-deferred-compilation-deny-list nil)

;; Allow the installation of unsigned packages, but verify the
;; signature if possible:

(setq package-check-signature 'allow-unsigned)

;; While using Straight with direct Github repos,
;; adding Melpa and others isn't a bad idea:

(require 'use-package)

(add-to-list 'package-archives
             '("melpa" . "https://melpa.org/packages/"))

(add-to-list 'package-archives
             '("elpa-dev" . "https://elpa.gnu.org/devel/"))

;; Configure straight https://github.com/raxod502/straight.el#getting-started

(defvar bootstrap-version)
(let ((bootstrap-file
       (expand-file-name "straight/repos/straight.el/bootstrap.el" user-emacs-directory))
      (bootstrap-version 6))
  (unless (file-exists-p bootstrap-file)
    (with-current-buffer
        (url-retrieve-synchronously
         "https://raw.githubusercontent.com/radian-software/straight.el/develop/install.el"
         'silent 'inhibit-cookies)
      (goto-char (point-max))
      (eval-print-last-sexp)))
  (load bootstrap-file nil 'nomessage))

(straight-use-package 'use-package)

;; While that enables the :straight t extension to use-package, let's just have that be the default:
(use-package straight
  :custom (straight-use-package-by-default t
           straight-default-vc 'git))

;; See the details in https://dev.to/jkreeftmeijer/emacs-package-management-with-straight-el-and-use-package-3oc8

(use-package org
  ;; TODO: Using the latest org-mode
  ;; :straight (:type built-in)
  )

;; Let's rock:
(org-babel-load-file "$HAMACS_DIR/bootstrap.org")

(provide 'init)
;;; init.el ends here
EOF

echo "Created $HAMACS_DEST/init.el"
