#!/usr/bin/env zsh

error() {
  echo "error: $*"
  exit 1
}

directories=(
  ~/.cache/zsh
  ~/.local/bin
  ~/.local/share/zsh/plugins
  ~/.local/share/zsh/site-functions
)

for directory in $directories; do
  mkdir -p $directory
done

plugins=(
  zsh-users/zsh-autosuggestions
  zsh-users/zsh-history-substring-search
  zsh-users/zsh-syntax-highlighting
  zsh-users/zsh-completions
)

for plugin in $plugins; do
  plugin_name=${plugin/*\//}
  plugin_directory=~/.local/share/zsh/plugins/$plugin_name
  if [ -d $plugin_directory ]; then
    if ! git -C $plugin_directory diff-index --quiet HEAD --; then
      error $plugin_directory contains unstaged changes
    fi
    pull=`git -C $plugin_directory pull`
    if [ "$pull" != "Already up-to-date." ]; then
      echo changed pulled $plugin_directory
    fi
  else
    git clone https://github.com/$plugin.git $plugin_directory > /dev/null
    echo changed cloned $plugin_directory
  fi
  old_plugin_directory=~/.config/zsh/$plugin_name
  if [ -d $old_plugin_directory ]; then
    rm -rf $old_plugin_directory
    echo changed removed $old_plugin_directory
  fi
done

declare -A symlinks
symlinks=(
  ~/.config/zsh/zlogin ~/.zlogin
  ~/.config/zsh/zlogout ~/.zlogout
  ~/.config/zsh/zprofile ~/.zprofile
  ~/.config/zsh/zshenv ~/.zshenv
  ~/.config/zsh/zshrc ~/.zshrc
  ~/.config/zsh/prompt_fresh_setup
    ~/.local/share/zsh/site-functions/prompt_fresh_setup
  ~/.config/zsh/cmake-uninstall ~/.local/bin/cmake-uninstall
  ~/.config/zsh/$ ~/.local/bin/$
  ~/.config/zsh/url/url ~/.local/bin/url
)

for completion in ~/.config/zsh/**/_*; do
  filename=`basename $completion`
  symlinks[$completion]=~/.local/share/zsh/site-functions/$filename
done

completions=( ~/.local/share/zsh/plugins/zsh-completions/src/* )
for completion in $completions; do
  filename=`basename $completion`
  name=${filename:1}
  if command -v $name > /dev/null; then
    symlinks[$completion]=~/.local/share/zsh/site-functions/$filename
  fi
done

for source in ${(k)symlinks}; do
  dest=$symlinks[$source]
  if [ -L $dest ]; then
    target=`readlink $dest`
    if [ "$target" != "$source" ]; then
      rm $dest
      ln -s $source $dest
      echo changed replace incorrect symlink $dest
    fi
  elif [ -f $dest ]; then
    error symlink failed $dest exists but is a regular file
  else
    ln -s $source $dest
    echo changed created symlink $dest
  fi
done