#!/bin/bash

#
# This script can be "curl-piped" into bash to bootstrap a dotfiles repo when
# yadm is not locally installed. Read below for instructions.
#
# This script is hosted at bootstrap.yadm.io to make it easy to remember/type.
#
# DISCLAIMER: In general, I would advise against piping someone's code directly
#             from the Internet into an interpreter (like Bash). You should
#             probably review any code like this prior to executing it. I leave
#             it to you to decide if this is risky behavior or not. The main
#             reason this script exists is because I find it to be a pragmatic
#             way to bootstrap my dotfiles, and install yadm in one step
#             (allowing the yadm project to be a submodule of my dotfiles
#             repo).
#
# Invoke bootstrap with:
#
#   curl -L bootstrap.yadm.io | bash
#
#     OR
#
#   curl -L bootstrap.yadm.io | bash [-s -- REPO_URL [YADM_RELEASE]]
#
# Alternatively, source in this file to export a yadm() function which uses
# yadm remotely until it is locally installed.
#
#   source <(curl -L bootstrap.yadm.io)
#

YADM_REPO="https://github.com/yadm-dev/yadm"
YADM_RELEASE=${release:-master}
REPO_URL=""

function _private_yadm() {
  unset -f yadm
  if command -v yadm &> /dev/null; then
    echo "Found yadm installed locally, removing remote yadm() function"
    unset -f _private_yadm
    command yadm "$@"
  else
    function yadm() { _private_yadm "$@"; }; export -f yadm
    echo WARNING: Using yadm remotely. You should install yadm locally.
    curl -fsSL "$YADM_REPO/raw/$YADM_RELEASE/yadm" | bash -s -- "$@"
  fi
}
export -f _private_yadm
function yadm() { _private_yadm "$@"; }; export -f yadm

# if being sourced, return here, otherwise continue processing
return 2>/dev/null
unset -f yadm

function remote_yadm() {
  curl -fsSL "$YADM_REPO/raw/$YADM_RELEASE/yadm" | bash -s -- "$@"
}

function ask_about_source() {
  if ! command -v yadm &> /dev/null; then
    echo
    echo "***************************************************"
    echo "yadm is NOT currently installed."
    echo "You should install it locally, this link may help:"
    echo "https://yadm.io/docs/install"
    echo "***************************************************"
    echo
    echo "If installation is not possible right now, you can temporarily \"source\""
    echo "in a yadm() function which fetches yadm remotely each time it is called."
    echo
    echo "    source <(curl -L bootstrap.yadm.io)"
    echo
  fi
}

function build_url() {
  echo "No repo URL provided."
  echo
  echo "Where is your repo?"
  echo
  echo "  1. GitHub"
  echo "  2. Bitbucket"
  echo "  3. GitLab"
  echo "  4. Other"
  echo
  read -r -p "Where is your repo? (1/2/3/4) ->" choice < /dev/tty
  case $choice in
    1)
      REPO_URL="https://github.com/"
      ;;
    2)
      REPO_URL="https://bitbucket.org/"
      ;;
    3)
      REPO_URL="https://gitlab.com/"
      ;;
    *)
      echo
      echo Please specify the full URL of your dotfiles repo
      read -r -p "URL ->" choice < /dev/tty
      REPO_URL="$choice"
      return
      ;;
  esac

  echo
  echo "Provide your user and repo separated by '/'"
  echo "For example: UserName/dotfiles"
  echo
  read -r -p "User/Repo ->" choice < /dev/tty
  [[ "$choice" =~ ^[^[:space:]]+/[^[:space:]]+$ ]] || {
    echo "Not formatted as USER/REPO"
    REPO_URL=
    return
  }
  REPO_URL="${REPO_URL}${choice}.git"
}

function main() {

  [ -n "$1" ] && REPO_URL="$1"
  [ -n "$2" ] && YADM_RELEASE="$2"
  [ -z "$REPO_URL" ] && build_url
  [ -z "$REPO_URL" ] && echo "Unable to determine the repo URL" && exit 1

  echo "Using URL: $REPO_URL"
  remote_yadm clone "$REPO_URL"

  ask_about_source

}

main "$@"