#!/usr/bin/env bash
# Copyright 2017 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

set -eo pipefail; [[ "${TRACE}" ]] && set -x

readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"

readonly VERSION_FILE="${SCRIPT_DIR}/.cipd_version"
readonly CIPD_BACKEND="https://chrome-infra-packages.appspot.com"

declare HOST_PLATFORM="$(uname -s | tr '[:upper:]' '[:lower:]')"
case "${HOST_PLATFORM}" in
  linux)
    readonly HOST_PLATFORM="linux"
    ;;
  darwin)
    readonly HOST_PLATFORM="mac"
    ;;
  *)
    echo "Unknown operating system." >&2
    exit 1
esac

HOST_ARCH="$(uname -m | tr '[:upper:]' '[:lower:]')"
case "${HOST_ARCH}" in
  x86_64|amd64)
    readonly HOST_ARCH="amd64"
    ;;
  arm*)
    readonly HOST_ARCH="${HOST_ARCH}"
    ;;
  *86)
    readonly HOST_ARCH=386
    ;;
  *)
    echo "Unknown machine architecture." >&2
    exit 1
esac

readonly PLATFORM="${HOST_PLATFORM}-${HOST_ARCH}"
readonly VERSION="$(cat ${VERSION_FILE})"
readonly URL="${CIPD_BACKEND}/client?platform=${PLATFORM}&version=${VERSION}"
readonly CLIENT="${SCRIPT_DIR}/.cipd_client"

readonly USER_AGENT="buildtools/$(git -C ${SCRIPT_DIR} rev-parse HEAD 2>/dev/null || echo "???")"

function actual_sha256() {
  if type shasum >/dev/null ; then
    shasum -a 256 "$1" | cut -d' ' -f1
  else
    echo "The \`shasum\` command is missing. Please use your package manager to install it." >&2
    return 1
  fi
}

function expected_sha256() {
  local line
  while read -r line; do
    if [[ "${line}" =~ ^([0-9a-z\-]+)[[:blank:]]+sha256[[:blank:]]+([0-9a-f]+)$ ]] ; then
      local platform="${BASH_REMATCH[1]}"
      local hash="${BASH_REMATCH[2]}"
      if [[ "${platform}" ==  "$1" ]]; then
        echo "${hash}"
        return 0
      fi
    fi
  done < "${VERSION_FILE}.digests"

  echo "Platform $1 is not supported by the CIPD client bootstrap. There's no pinned hash for it in the *.digests file." >&2

  return 1
}

# bootstraps the client from scratch using 'curl'.
function bootstrap() {
  local expected_hash="$(expected_sha256 "${PLATFORM}")"
  if [[ -z "${expected_hash}" ]] ; then
    exit 1
  fi

  echo "Bootstrapping cipd client for ${HOST_PLATFORM}-${HOST_ARCH}..."
  local CLIENT_TMP="$(mktemp -p "${SCRIPT_DIR}" 2>/dev/null || mktemp "${SCRIPT_DIR}/.cipd_client.XXXXXXX")"
  if type curl >/dev/null ; then
    curl -f --progress-bar "${URL}" -A "${USER_AGENT}"  -L -o "${CLIENT_TMP}"
  else
    echo "The \`curl\` command is missing. Please use your package manager to install it." >&2
    exit 1
  fi
  trap "rm -f '${CLIENT_TMP}'" EXIT ERR HUP INT TERM

  local actual_hash="$(actual_sha256 "${CLIENT_TMP}")"
  if [[ -z "${actual_hash}" ]] ; then
    exit 1
  fi

  if [[ "${actual_hash}" != "${expected_hash}" ]]; then
    echo "SHA256 digest of the downloaded CIPD client is incorrect. Check that *.digests file is up-to-date." >&2
    exit 1
  fi

  chmod +x "${CLIENT_TMP}"
  mv -f "${CLIENT_TMP}" "${CLIENT}"
  trap - EXIT
}

# self_update asks the existing client to update itself, if necessary.
function self_update() {
  "${CLIENT}" selfupdate -version-file "${VERSION_FILE}" -service-url "${CIPD_BACKEND}"
}

if [[ ! -x "${CLIENT}" ]]; then
  bootstrap
fi

export CIPD_HTTP_USER_AGENT_PREFIX="${USER_AGENT}"
if ! self_update ; then
  echo "CIPD selfupdate failed. Trying to bootstrap the CIPD client from scratch..." >&2
  bootstrap
  if ! self_update ; then  # we need to run it again to setup .cipd_version file
    echo "Bootstrap from scratch failed. Run \`CIPD_HTTP_USER_AGENT_PREFIX=${USER_AGENT}/manual ${CLIENT} selfupdate -version-file '${VERSION_FILE}'\` to diagnose if this is repeating." >&2
  fi
fi

exec "${CLIENT}" "${@}"
