#!/bin/bash
# Copyright 2020 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.

# Specify the version of the tools to download
if [[ "$1" == "--help" || "$1" == "-h" ]]; then
  echo "$0 [<sdk_version>]"
  echo
  echo "Downloads the specified SDK version for the current platform"
  echo "sdk_version can be any valid SDK version string"
  echo "Use 'latest' (default) for the appropriate LATEST_LINUX or LATEST_MAC"
  echo "Use 'current' for the version in the SDK meta/manifest.json"
  exit 0
elif [[ "$1" == "" ]]; then
  VER_FUCHSIA_SDK="latest"
else
  VER_FUCHSIA_SDK="$1"
fi

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 )"

# Common functions.
# shellcheck disable=SC1090
source "${SCRIPT_SRC_DIR}/common.sh" || exit $?
THIRD_PARTY_DIR="$(get_third_party_dir)" # finds path to //third_party
FUCHSIA_SDK_DIR="${THIRD_PARTY_DIR}/fuchsia-sdk" # finds path to //third_party/fuchsia-sdk
TMP_SDK_DOWNLOAD_DIR=$(mktemp -d)
DOWNLOADED_SDK_PATH="${TMP_SDK_DOWNLOAD_DIR}/gn-sdk.tar.gz"
TMP_SDK_DIR=$(mktemp -d)
SDK_VERSION_FILE="${SCRIPT_SRC_DIR}/../sdk.version"

cleanup() {
  # Remove the SDK downloads directory
  if [ -f "${TMP_SDK_DOWNLOAD_DIR}" ]; then
    rm -rf "${TMP_SDK_DOWNLOAD_DIR}"
  fi
  if [ -d "${TMP_SDK_DIR}" ]; then
    rm -rf "${TMP_SDK_DIR}"
  fi
}

if is-mac; then
  PLATFORM="mac"
else
  PLATFORM="linux"
fi
ARCH="${PLATFORM}-amd64"

# You can browse the GCS bucket from here to look for builds https://console.cloud.google.com/storage/browser/fuchsia/development
# You can get the instance ID with the following curl commands:
#  Linux: `curl -sL "https://storage.googleapis.com/fuchsia/development/LATEST_LINUX`
#  Mac: `curl -sL "https://storage.googleapis.com/fuchsia/development/LATEST_MAC`
# You can use the gsutil command-line tool to browse and search as well:
#  Get the instance ID:
#    Linux: `gsutil cat gs://fuchsia/development/LATEST_LINUX`
#    Mac: `gsutil cat gs://fuchsia/development/LATEST_MAC`
#  List the SDKs available for the instance ID
#    `gsutil ls -r gs://fuchsia/development/$INSTANCE_ID/sdk`
#  Download a SDK from GCS to your current directory:
#    Linux: `gsutil cp gs://fuchsia/development/$INSTANCE_ID/sdk/linux-amd64/gn.tar.gz .`
#    Mac: `gsutil cp gs://fuchsia/development/$INSTANCE_ID/sdk/mac-amd64/gn.tar.gz .`

# If specified version is "latest" get the latest version number
if [[ "${VER_FUCHSIA_SDK}" == "latest" ]]; then
  PLATFORM_UPPER="$(echo "${PLATFORM}" | tr '[:lower:]' '[:upper:]')"
  VER_FUCHSIA_SDK="$(curl -sL "https://storage.googleapis.com/fuchsia/development/LATEST_${PLATFORM_UPPER}")"
elif [[ "${VER_FUCHSIA_SDK}" == "current" || "${VER_FUCHSIA_SDK}" == "sdk" ]]; then
  if [[ ! -f "${SDK_VERSION_FILE}" ]]; then
    echo "SDK version file ${SDK_VERSION_FILE} does not exist, run this script with 'latest' to refresh this file"
    cleanup
    exit 1
  fi
  VER_FUCHSIA_SDK="$(cat "${SDK_VERSION_FILE}")"
fi

echo "Downloading Fuchsia SDK ${VER_FUCHSIA_SDK} ..."
# Example URL: https://storage.googleapis.com/fuchsia/development/8888449404525421136/sdk/linux-amd64/gn.tar.gz
curl -sL "https://storage.googleapis.com/fuchsia/development/${VER_FUCHSIA_SDK}/sdk/${ARCH}/gn.tar.gz" -o "${DOWNLOADED_SDK_PATH}"
echo "complete."
echo

echo "Extracting Fuchsia SDK..."
tar -xf "${DOWNLOADED_SDK_PATH}" -C "${TMP_SDK_DIR}"
echo "complete."
echo


# Delete existing SDK
if [[ -d "${FUCHSIA_SDK_DIR}" ]]; then
  echo "Removing existing SDK..."
  # Remove entire folder and remake folder of the same name to remove hidden files
  # e.g. third_party/fuchsia-sdk/.build-id/
  rm -rf "${FUCHSIA_SDK_DIR}"
  mkdir "${FUCHSIA_SDK_DIR}"
  echo "complete."
  echo
fi

# Copy new SDK to SDK dir
cp -r "${TMP_SDK_DIR}/." "${FUCHSIA_SDK_DIR}"

# Write out the downloaded SDK version
echo "${VER_FUCHSIA_SDK}" > "${SDK_VERSION_FILE}"

cleanup

echo "New SDK ${VER_FUCHSIA_SDK} downloaded and extracted successfully to ${FUCHSIA_SDK_DIR}."
