#!/bin/bash
# Copyright 2019 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 -eu # Error checking
err_print() {
  cleanup
  echo "Error on line $1"
}
trap 'err_print $LINENO' ERR
DEBUG_LINE() {
    "$@"
}

SCRIPT_SRC_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"
FORCE=0

# shellcheck disable=SC1090
source "${SCRIPT_SRC_DIR}/common.sh" || exit $?
REPO_ROOT="$(get_gn_root)" # finds path to REPO_ROOT
BUILD_TOOLS_DIR="$(get_buildtools_dir)" # finds path to BUILD_TOOLS_DIR
DEPOT_TOOLS_DIR="$(get_depot_tools_dir)" # finds path to DEPOT_TOOLS_DIR
DOWNLOADS_DIR="${BUILD_TOOLS_DIR}/downloads"

cleanup() {
  echo "Cleaning up downloaded build tools..."
  # Remove the download directories
  rm -rf "${BUILD_TOOLS_DIR}" "${DEPOT_TOOLS_DIR}"
}

function usage {
  echo "Usage: $0"
  echo "  [--force]"
  echo "    Delete build tools directory before downloading"
}

# Parse command line
for i in "$@"
do
case "${i}" in
    -f|--force)
    FORCE=1
    ;;
    *)
    # unknown option
    usage
    exit 1
    ;;
esac
done

# If force option is set, cleanup all downloaded tools
if (( FORCE )); then
  cleanup
fi

# Create build tools directory if it doesn't exist
if [ ! -d "${BUILD_TOOLS_DIR}" ]; then
  mkdir "${BUILD_TOOLS_DIR}"
fi

# Create depot tools directory if it doesn't exist
if [[ ! -d "${DEPOT_TOOLS_DIR}" ]]; then
  mkdir "${DEPOT_TOOLS_DIR}"
fi

# Create build tools download directory if it doesn't exist
if [ ! -d "${DOWNLOADS_DIR}" ]; then
  mkdir "${DOWNLOADS_DIR}"
fi

if is-mac; then
  ARCH=mac-amd64
else
  ARCH=linux-amd64
fi

# Download a CIPD archive and extract it to a directory based on the name and ${ARCH}
# download_cipd [name] [cipd-ref] [cipd-version] [cipd-architecture]
function download_cipd {
  CIPD_NAME="$1"
  # Valid cipd references can be found with the command-line tool: cipd ls -r | grep $search
  CIPD_REF="$2"
  # Valid cipd versions can be of many types, such as "latest", a git_revision, or a version string
  CIPD_VERSION="$3"
  # Download for a specific architecture, if empty string then download a generic version
  # For CIPD urls, replace /dl/ with /p/ if you want to inspect the directory in a web browser
  if [[ "$4" == "" ]]; then
    CIPD_URL="https://chrome-infra-packages.appspot.com/dl/${CIPD_REF}/+/${CIPD_VERSION}"
  else
    CIPD_URL="https://chrome-infra-packages.appspot.com/dl/${CIPD_REF}/${4}/+/${CIPD_VERSION}"
  fi
  CIPD_FILE="${DOWNLOADS_DIR}/${CIPD_NAME}-${ARCH}-${CIPD_VERSION}.zip"
  CIPD_TMP="${DOWNLOADS_DIR}/tmp-${CIPD_NAME}-${ARCH}-${CIPD_VERSION}"
  CIPD_DIR="${DOWNLOADS_DIR}/${CIPD_NAME}-${ARCH}-${CIPD_VERSION}"

  # Check that unzip is available, otherwise it will fail below and imply that the data was invalid
  UNZIP_BIN="$(command -v unzip)"
  if [[ "${UNZIP_BIN}" == "" ]]; then
    fx-error "Cannot find unzip."
    exit 2
  fi

  if [ ! -f "${CIPD_FILE}" ]; then
    mkdir -p "${DOWNLOADS_DIR}"
    echo "Downloading ${CIPD_NAME} archive ${CIPD_URL} ..."
    curl -L "${CIPD_URL}" -o "${CIPD_FILE}" -#
    echo -e "Verifying ${CIPD_NAME} download ${CIPD_FILE} ...\c"
    # CIPD will return a file containing "no such ref" if the URL is invalid, so need to verify the ZIP file
    if ! unzip -qq -t "${CIPD_FILE}" &> /dev/null; then
      rm -f "${CIPD_FILE}"
      echo "Error: Downloaded archive from ${CIPD_URL} failed with invalid data"
      exit 1
    fi
    rm -rf "${CIPD_TMP}" "${CIPD_DIR}"
    echo "complete."
  fi
  if [ ! -d "${CIPD_DIR}" ]; then
    echo -e "Extracting ${CIPD_NAME} archive to ${CIPD_DIR} ...\c"
    rm -rf "${CIPD_TMP}"
    unzip -q "${CIPD_FILE}" -d "${CIPD_TMP}"
    ln -sf "${CIPD_NAME}-${ARCH}-${CIPD_VERSION}" "${DOWNLOADS_DIR}/${CIPD_NAME}-${ARCH}"
    mv "${CIPD_TMP}" "${CIPD_DIR}"
    echo "complete."
  fi
}

# Download prebuilt binaries with specific versions known to work with the SDK.
# These values can be found in $FUCHSIA_ROOT/integration/prebuilts but should
# not need to be updated regularly since these tools do not change very often.
download_cipd "clang"   "fuchsia/third_party/clang"  "git_revision:b25fc4123c77097c05ea221e023fa5c6a16e0f41" "${ARCH}"
download_cipd "gn"      "gn/gn"                      "git_revision:239533d2d91a04b3317ca9101cf7189f4e651e4d" "${ARCH}"
download_cipd "ninja"   "infra/ninja"                "version:1.9.0"                                         "${ARCH}"
# Download python version of gsutil, not referenced by $FUCHSIA_ROOT/integration/prebuilts, with generic architecture
download_cipd "gsutil"  "infra/3pp/tools/gsutil"     "version:2@4.62"                                        ""
# buildidtool is used to extract build id symbols from binaries.
download_cipd "buildidtool"  "fuchsia/tools/buildidtool"  "git_revision:5c546d2e55ae0a2afe565333c6118a48780f8017" "${ARCH}"

# Download the SDK using the current sdk.version file
"${SCRIPT_SRC_DIR}/update-fuchsia-sdk.sh" "current"

# Always refresh the symlinks because this script may have been updated
echo -e "Rebuilding symlinks in ${DEPOT_TOOLS_DIR} ...\c"
ln -sf "../downloads/clang-${ARCH}" "${DEPOT_TOOLS_DIR}/clang-${ARCH}"
ln -sf "../downloads/clang-${ARCH}/bin/clang-format" "${DEPOT_TOOLS_DIR}/clang-format"
ln -sf "../downloads/gn-${ARCH}/gn" "${DEPOT_TOOLS_DIR}/gn"
ln -sf "../downloads/ninja-${ARCH}/ninja" "${DEPOT_TOOLS_DIR}/ninja"
ln -sf "../downloads/buildidtool-${ARCH}/buildidtool" "${DEPOT_TOOLS_DIR}/buildidtool"
ln -sf "../downloads/gsutil-${ARCH}/gsutil" "${DEPOT_TOOLS_DIR}/gsutil"
echo "complete."

# Patch downloaded gsutil to use python3 instead of python
# https://www.debian.org/doc/packaging-manuals/python-policy/
# TODO: Fix this upstream in https://chrome-infra-packages.appspot.com/p/infra/3pp/tools/gsutil/+/
echo "Patching gsutil for python3"
chmod u+w "${DOWNLOADS_DIR}/gsutil-${ARCH}/gsutil"
sed -i'.bak' 's~^#!/usr/bin/env python$~#!/usr/bin/env python3~g' "${DOWNLOADS_DIR}/gsutil-${ARCH}/gsutil"

# This must be done after update-fuchsia-sdk.sh so the SDK will use this gsutil binary
echo "Creating symlink to downloaded gsutil"
ln -sf "../../../buildtools/downloads/gsutil-${ARCH}/gsutil" "${REPO_ROOT}/third_party/fuchsia-sdk/bin/gsutil"

echo "All build tools downloaded and extracted successfully to ${BUILD_TOOLS_DIR}"
