#!/bin/bash

pac_list=(
at
automake
autopep8
base
base-devel
bash-completion
bash-language-server
bc
brightnessctl
chromium
dmidecode
entr
eslint_d
feh
firefox-developer-edition
firefox-tridactyl
firefox-tridactyl-native
firefox-tridactyl-native-debug
fzf
gcc
git
haskell-language-server
haskell-ormolu
hsetroot
htop
httpie
jq
keepassxc
kitty
lua-language-server
make
man-db
man-pages
neovim
nmap
nodejs-lts-jod
pacman-contrib
pandoc-cli
pandoc-crossref
parallel
pass
pkgbuild-language-server
pnpm
ripgrep
sshfs
stylelint
svelte-language-server
tailwindcss-language-server
task
tldr
tmux
tmuxp
tree
tree-sitter-cli
ts-node
typescript-language-server
unzip
vim-language-server
wget
xclip
yaml-language-server
)

aurpac_list=(
hadolint-bin
nvm
nvimpager
paru
tmux-bash-completion-git
ttf-iosevka-term-ss08
vim-plug
vtsls
xbanish
)

install() {
  local package="$1"
  if pacman -Qi "$package" &> /dev/null; then
    echo "$package is already installed"
  else
    echo "Installing " "$package"
    sudo pacman -S --noconfirm --needed "$package"
  fi
}

aurpac() {
  git clone "https://aur.archlinux.org/$1.git" "$HOME/.build/$1"
}

install_packages() {
  announce "Installing packages"
  local count
  for pac in "${pac_list[@]}" ; do
    count=$((count+1))
    install "$pac";
  done
  echo "$count packages installed"
}

install_dotfiles() {
  announce "Installing dotfiles"
  origin="https://git.hektormisplon.xyz/hektor/dots"
  git clone "$origin" "$HOME/dots"
  cp -r "$HOME/dots/.git" "$HOME/.git"
  git --git-dir="$HOME/.git" config --local status.showUntrackedFiles no
  git --git-dir="$HOME/.git" stash -m "[dots]"
  git --git-dir="$HOME/.git" stash apply
  git --git-dir="$HOME/.git" restore "$HOME"
}

install_aur_packages() {
  announce "Installing AUR packages"
  local count
  for package in "${aurpac_list[@]}" ; do
    if pacman -Qi "$1" &> /dev/null; then
      echo "$1 is already installed"
    else
      count=$((count+1))
      aurpac "$package" && makepkg -si -D "$HOME/.build/$package"
    fi
  done
  echo "$count AUR packages installed"
}

setup_neovim() {
  announce "Setting up NeoVim"
  git clone --depth=1 https://github.com/savq/paq-nvim.git \
      "${XDG_DATA_HOME:-$HOME/.local/share}"/nvim/site/pack/paqs/start/paq-nvim
}

setup_keyboard() {
  announce "Setting up keyboard"
  install "interception-tools"
  install "interception-caps2esc"
  udevmon_config_contents="\
- JOB: intercept -g \$DEVNODE | caps2esc -m 1 | uinput -d \$DEVNODE
  DEVICE:
    EVENTS:
      EV_KEY: [KEY_CAPSLOCK]"
  if [ -f /etc/interception/udevmon.yaml ] && diff -q <(echo "$udevmon_config_contents") /etc/interception/udevmon.yaml; then
    echo "udevmon config already exists"
    echo "$udevmon_config_contents"
  elif [ -f /etc/interception/udevmon.yaml ]; then
    echo "interception udevmon.yaml already exists"
    cat /etc/interception/udevmon.yaml
    echo "verify if this config matches the one below"
    echo "$udevmon_config_contents"
  else
    echo "interception udevmon.yaml does not exist, creating one"
    sudo bash -c "echo '$udevmon_config_contents' > /etc/interception/udevmon.yaml"
  fi

  sudo systemctl enable --now udevmon.service

  if pgrep -x caps2esc > /dev/null; then
    echo "caps2esc is already running"
  else
    caps2esc -m 1
  fi
}

configure_gnome() {
  announce "Configuring Gnome"; setup-gnome
}

setup_firewall() {
  announce "Configuring firewalld"
  install firewalld
  sudo systemctl enable --now firewalld
}

setup_docker() {
  announce "Setting up Docker"
  install docker
  install docker-compose
  sudo systemctl enable --now docker.socket
  sudo usermod -aG docker "$USER"
  echo "User added to docker group, please restart your session"
}

announce() {
  local message="$1"
  echo " "
  echo "[dots] $message"
  echo " "
}

confirm() {
  local question="$1"
  read -r -p "[dots] $question? [y/N]" -n 1
  case "$REPLY" in y|Y ) "$2";; * ) echo "Skipping"; esac
}

printf '%s\n' "${pac_list[@]}"
confirm "Install these packages? " install_packages
printf '%s\n' "${aurpac_list[@]}"
confirm "Install these AUR packages? " install_aur_packages
confirm "Setup NeoVim? " setup_neovim
confirm "Install dotfiles? " install_dotfiles
confirm "Setup keyboard? " setup_keyboard
if pacman -Qi "gdm" &> /dev/null; then
  confirm "Configure Gnome? " configure_gnome
fi
confirm "Setup firewall? " setup_firewall
confirm "Setup Docker? " setup_docker
