#!/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.

#### CATEGORY=Run, inspect and debug
### run fuchsia devtools

## usage: fx fdt [VERSION]
##   VERSION   Download (if necessary) and run a specific version of
##             Fuchsia devtools. If not specified, the current version
##             in //prebuilt will be used.
##             VERSION is either a CIPD hash or "latest".

# shellcheck source=/dev/null
source "$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd)"/lib/vars.sh || exit $?
set -e

# Fills $FX_DEVICE_NAME, $FX_DEVICE_ADDR, $FX_SSH_ADDR, and $FX_SSH_PORT if
# there is one device currently attached.
fx-export-device-address

PREBUILT_DIR="$FUCHSIA_DIR/prebuilt/gui_tools"
DOWNLOAD_DIR="$FUCHSIA_DIR/prebuilt/gui_tools/download"

if [[ $HOST_PLATFORM == "mac-x64" ]]; then
  BINARY="Fuchsia DevTools.app"
  ZIP="macos/macos.zip"
  ZIP_OLD="fuchsia_devtools/macos/macos.zip"
  DOWNLOAD_ZIP="$DOWNLOAD_DIR/$ZIP"
  DOWNLOAD_ZIP_OLD="$DOWNLOAD_DIR/$ZIP_OLD"
  DOWNLOAD_UNZIP_DIR="$DOWNLOAD_DIR/fuchsia_devtools/macos-extracted"
  DOWNLOAD="$DOWNLOAD_UNZIP_DIR/$BINARY"
  PREBUILT_ZIP="$PREBUILT_DIR/$ZIP"
  PREBUILT_ZIP_OLD="$PREBUILT_DIR/$ZIP_OLD"
  PREBUILT_UNZIP_DIR="$PREBUILT_DIR/fuchsia_devtools/macos-extracted"
  PREBUILT="$PREBUILT_UNZIP_DIR/$BINARY"
else
  BINARY_OLD="fuchsia_devtools/linux/fuchsia_devtools"
  PREBUILT_OLD="$PREBUILT_DIR/$BINARY_OLD"
  DOWNLOAD_OLD="$DOWNLOAD_DIR/$BINARY_OLD"

  BINARY="linux/fuchsia_devtools"
  PREBUILT="$PREBUILT_DIR/$BINARY"
  DOWNLOAD="$DOWNLOAD_DIR/$BINARY"
fi

# Use prebuilt version if no arguments are passed.
if [[ $# == 0 ]]; then
  if [[ $HOST_PLATFORM == "mac-x64" ]]; then
    temp_dir="${PREBUILT_UNZIP_DIR}-temp"
    # On the mac if we have a prebuilt zip then we are good to go.
    if [[ -e "${PREBUILT_ZIP}" ]]; then
      rm -rf "${PREBUILT_UNZIP_DIR}"
      mkdir -p "${temp_dir}"
      if ! unzip -qq "${PREBUILT_ZIP}" -d "${temp_dir}"; then
        rm -rf "${temp_dir}"
        echo "Prebuilt archive failed to extract."
        exit 1
      fi
      mv "${temp_dir}" "${PREBUILT_UNZIP_DIR}"
      open "$PREBUILT"
      exit 0
    elif [[ -e "${PREBUILT_ZIP_OLD}" ]]; then
      rm -rf "${PREBUILT_UNZIP_DIR}"
      mkdir -p "${temp_dir}"
      if ! unzip -qq "${PREBUILT_ZIP_OLD}" -d "${temp_dir}"; then
        rm -rf "${temp_dir}"
        echo "Prebuilt archive failed to extract."
        exit 1
      fi
      mv "${temp_dir}" "${PREBUILT_UNZIP_DIR}"
      open "$PREBUILT"
      exit 0
    fi
  else
    # else we are on linux
    # If the new prebuilt binary exists, run it.
    if [[ -x "$PREBUILT" ]]; then
      # Maybe add ` > /dev/null 2>&1 &` in the future.
      exec "$PREBUILT"
    # If the old prebuilt binary exists, run it.
    elif [[ $HOST_PLATFORM == "linux-x64" ]] && [[ -x "$PREBUILT_OLD" ]]; then
      # Maybe add ` > /dev/null 2>&1 &` in the future.
      exec "$PREBUILT_OLD"
    fi
  fi
  # We are on mac and don't have a zip file or we are linux and are missing
  # a binary with either the old or new name. This should only happen if the
  # jiri fetch for the prebuilt is not configured properly or has not run.
  cat << end
To use fdt, JIRI should download it. Please run the following commands:
 jiri init -fetch-optional=fuchsia_devtools && jiri fetch-packages --local-manifest=true
end
  exit 1;
fi

# If a specific version of FDT is requested, it can be downloaded directly.
# Check that the fuchsia_devtools are downloaded and then run it.
# If the version is already downloaded, it will not be re-downloaded.

# Using "latest" or a CIPD hash.
version="$1"
shift

# Check fuchsia/gui_tools/... first as that is the new location
# shellcheck disable=SC2016
if ! echo 'fuchsia/gui_tools/fuchsia_devtools/${platform}' "$version" | cipd ensure -ensure-file - -root "$DOWNLOAD_DIR"; then
  # Fallback to checking fuchsia_internal/gui_tools...
  # shellcheck disable=SC2016
  if ! echo 'fuchsia_internal/gui_tools/fuchsia_devtools/${platform}' "$version" | cipd ensure -ensure-file - -root "$DOWNLOAD_DIR"; then
    echo "Failed to download $version."
    exit 1
  fi
fi

if [[ $HOST_PLATFORM == "mac-x64" ]]; then
  rm -rf "${DOWNLOAD_UNZIP_DIR}"
  temp_dir="${DOWNLOAD_UNZIP_DIR}-temp"
  if [[ -e "${DOWNLOAD_ZIP}" ]]; then
    mkdir -p "${temp_dir}"
    if ! unzip -qq "${DOWNLOAD_ZIP}" -d "${temp_dir}"; then
      rm -rf "${temp_dir}"
      echo "Downloaded archive for $version failed to extract."
      exit 1
    fi
    mv "${temp_dir}" "${DOWNLOAD_UNZIP_DIR}"
    open "$DOWNLOAD"
  elif [[ -e "${DOWNLOAD_ZIP_OLD}" ]]; then
    mkdir -p "${temp_dir}"
    if ! unzip -qq "${DOWNLOAD_ZIP_OLD}" -d "${temp_dir}"; then
      rm -rf "${temp_dir}"
      echo "Downloaded archive for $version failed to extract."
      exit 1
    fi
    mv "${temp_dir}" "${DOWNLOAD_UNZIP_DIR}"
    open "$DOWNLOAD"
  fi
else
  # In the future, we should add the following to eliminate the terminal spam:
  #   > /dev/null 2>&1 &
  # For the near term, using this for debug output is important.
  if [[ -x "$DOWNLOAD" ]]; then
    "$DOWNLOAD" "$@"
  elif [[ -x "$DOWNLOAD_OLD" ]]; then
    "$DOWNLOAD_OLD" "$@"
  else
    echo "Failed to find Fuchsia DevTools binary."
    exit 1
  fi
fi
