#!/usr/bin/env bash
# Link the front ends into place. Nothing is copied, so a `git pull` updates
# what you are running.
set -euo pipefail

src="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
config="${XDG_CONFIG_HOME:-$HOME/.config}"
binhome="${HOME}/.local/bin"

usage() {
    cat <<USAGE
menologion-install [quickshell|waybar|eww|bin|all]

  quickshell  link quickshell/ into a quickshell config as menologion/
  waybar      link the bar script and print the module to merge
  eww         link eww/ into your eww config
  bin         link menologion-waybar into ~/.local/bin
  all         bin + whichever of the three are already configured

USAGE
}

# Set when something was skipped, so the run can report it in its exit status
# without `set -e` tearing the rest of the install down.
skipped=0

link() {
    local from="$1" to="$2"
    mkdir -p "$(dirname "$to")"
    if [ -e "$to" ] && [ ! -L "$to" ]; then
        echo "  ! $to exists and is not a link — leaving it alone" >&2
        skipped=1
        return 0
    fi
    ln -sfn "$from" "$to"
    echo "  $to -> $from"
}

do_bin() {
    link "$src/bin/menologion-waybar" "$binhome/menologion-waybar"
    case ":$PATH:" in
        *":$binhome:"*) ;;
        *) echo "  note: $binhome is not on your PATH" >&2 ;;
    esac
}

do_quickshell() {
    link "$src/quickshell" "$config/quickshell/menologion"
    cat <<'NOTE'

  Add to your shell.qml:

      import qs.menologion.modules
      ...
      Menologion {}

  Or run it on its own:

      quickshell -p ~/.config/quickshell/menologion/shell.qml
NOTE
}

do_waybar() {
    link "$src/waybar/style.css" "$config/waybar/menologion.css"
    cat <<'NOTE'

  Add "custom/typikon" to a modules list, merge waybar/config.jsonc into
  your config, and @import "menologion.css" from your style.css.
NOTE
}

do_eww() {
    link "$src/eww" "$config/eww/menologion"
    cat <<'NOTE'

  Add to your eww.yuck:     (include "menologion/menologion.yuck")
  Add to your eww.scss:     @import "menologion/menologion.scss";
  Then put (menologion) in a window, or (menologion-bar) in a bar.
NOTE
}

require_typikon() {
    command -v typikon >/dev/null 2>&1 && return 0
    echo "menologion: typikon is not on PATH." >&2
    echo "  cargo install --git https://git.pumpin.online/funkpower/typikon" >&2
    exit 1
}

# --help must not be gated behind the dependency it tells you about.
case "${1:-all}" in
    -h|--help|help) usage; exit 0 ;;
esac
require_typikon

case "${1:-all}" in
    quickshell) do_bin; do_quickshell ;;
    waybar)     do_bin; do_waybar ;;
    eww)        do_bin; do_eww ;;
    bin)        do_bin ;;
    all)
        do_bin
        # `[ -d x ] && f` as the last statement of the script would make a
        # perfectly good run exit 1 under `set -e` whenever the directory is
        # absent. Hence the `|| true`, and the explicit exit below.
        [ -d "$config/quickshell" ] && do_quickshell || true
        [ -d "$config/waybar" ]     && do_waybar     || true
        [ -d "$config/eww" ]        && do_eww        || true
        ;;
    *) usage; exit 2 ;;
esac

exit "$skipped"
