#!/bin/bash -i

# The 'moniker' parameter is optional. If moniker is not specified,
# moniker will be set to the second argument (hostname | IP).

FORCE_REBUILD=false
while getopts "f:" OPTION
do
    case $OPTION in
        --help | -h)
            shift
            ;;
    esac
done

MONIKER=${1:-none}
PORT=2377

if [ -n "$_DOCK_MONIKER" ]; then
  echo "Remote docker is already configured for '$DOCK_MONIKER'. Try 'castoff' to disconnect."
  return 0
fi

if [ $MONIKER = "none" ]; then
  echo "This script is used in conjunction with 'register-dock'"
  echo
  echo "USAGE"
  echo "    $ source dock <ip or hostname configured in /etc/hosts>"
  echo "Examples:"
  echo "    $ dock my-centos1"
  echo "    $ dock 10.93.133.2"
  echo 
  echo "You can now run secure remote docker commands."
  echo "To undo this configuration:"
  echo "    $ castoff"
  echo
  echo "If you do not want your command line prompt to be updated, set DOCKERUTILS_DISABLE_PROMPT=true"
  kill -INT $$
fi

# Look up IP from moniker
FOUND_MONIKER=false
for f in $HOME/.docker/*; do
    if [ -d $f ] && [ -f $f/connection_config.txt ]; then
      while read -r line; do declare $line; done < "$f/connection_config.txt"
      if [ $DOCK_MONIKER = $MONIKER ]; then
        FOUND_MONIKER=true
        break
      fi
    fi
done

if [ $FOUND_MONIKER = false ]; then
  echo "Can't find dock configuration for $MONIKER"
  kill -INT $$  
fi

echo "Docking to $DOCK_USER@$DOCK_IP [Moniker: $DOCK_MONIKER]"

if [ -z "$DOCK_IP" ]; then
  kill -INT $$
fi

# Update command line prompt to reflect docked condition.
# Python virtual environment prompt (or lack therof) should remain unchanged.
update_dock_prompt() {
  _DOCK_MONIKER="[dock:$DOCK_MONIKER] "
  export _DOCK_MONIKER

  if [ -n "$_OLD_VIRTUAL_PS1" ]; then
    _UNDOCKED_PS1="$PS1"
    _OLD_VIRTUAL_PS1="$_OLD_VIRTUAL_PS1${_DOCK_MONIKER}"
    export _OLD_VIRTUAL_PS1
  else
    _UNDOCKED_PS1="$PS1"
  fi

  if [ "$SHELL" = "/bin/zsh" ]; then
    PS1=$PS1${_DOCK_MONIKER}
  else
    PS1=$PS1${_DOCK_MONIKER}
  fi

  export PS1
  export _UNDOCKED_PS1
}


# Remove docked condition including command line prompt.
# Python virtual environment prompt (or lack therof) should remain unchanged.
castoff() {
  _DOCK_MONIKER="[dock:$DOCK_MONIKER] "
  unset DOCKER_TLS_VERIFY
  unset DOCKER_CERT_PATH
  unset DOCKER_HOST
  unset DOCKER_IP

  if [ -n "$_OLD_VIRTUAL_PS1" ]; then
    if [ "$SHELL" = "/bin/zsh" ]; then
      _OLD_VIRTUAL_PS1="${_OLD_VIRTUAL_PS1%$_DOCK_MONIKER}"
    else
      _OLD_VIRTUAL_PS1=${_OLD_VIRTUAL_PS1%"$_DOCK_MONIKER"}
    fi
    export _OLD_VIRTUAL_PS1
  fi

  if [ "$SHELL" = "/bin/zsh" ]; then
    PS1=${PS1%$_DOCK_MONIKER}
  else
    PS1=${PS1%"$_DOCK_MONIKER"}
  fi
  export PS1

  unset _DOCK_MONIKER
  unset _UNDOCKED_PS1
  unset -f castoff
  unset -f sync-up
  unset -f sync-down
  unset -f do-sync-up
  unset -f do-sync-down
  echo "Castoff complete"
}

. dock-sync

export DOCKER_TLS_VERIFY=1
export DOCKER_CERT_PATH=${HOME}/.docker/${DOCK_IP}
export DOCKER_HOST=tcp://${DOCK_IP}:2377
export DOCKER_IP=${DOCK_IP}

if [ -z $DOCKERUTILS_DISABLE_PROMPT ]; then
  update_dock_prompt
fi