#!/bin/bash
set -e

# felt: a command-line utility for building and testing Flutter web engine.
#       It stands for Flutter Engine Local Tester.
# TODO: Add git fetch --tags step. Tags are critical for the correct Dart
# version.

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

if [ -z "`which gclient`" ]
then
  echo "ERROR: gclient is not in your PATH"
  echo "Fix: add the path to your installation of depot_tools to your PATH"
  exit 1
fi
GCLIENT_PATH=`which gclient`

if [ -z "`which autoninja`" ]
then
  echo "ERROR: autoninja is not in your PATH"
  echo "Fix: add the path to your installation of depot_tools to your PATH"
  exit 1
fi
NINJA_PATH=`which autoninja`

KERNEL_NAME=`uname`
CPU_NAME=`uname -m`
ENGINE_SRC_DIR="$(dirname $(dirname $(dirname $(dirname ${FELT_DIR}))))"
FLUTTER_DIR="${ENGINE_SRC_DIR}/flutter"
SDK_PREBUILTS_DIR="${FLUTTER_DIR}/prebuilts"

if [ -z "${DART_SDK_DIR}"]
then
  if [[ $KERNEL_NAME == *"Darwin"* ]]
  then
    TARGET_OS="macos"
  elif [[ $KERNEL_NAME == *"Linux"* ]]
  then
    TARGET_OS="linux"
  else
    echo "Unrecognized kernel name: ${KERNEL_NAME}"
    exit 1
  fi

  if [[ $CPU_NAME == *"x86_64"* ]]
  then
    TARGET_ARCH="x64"
  elif [[ $CPU_NAME == *"arm64"* ]]
  then
    TARGET_ARCH="arm64"
  else
    echo "Unrecognized architecture: ${CPU_NAME}"
    exit 1
  fi

  PREBUILT_TARGET="${TARGET_OS}-${TARGET_ARCH}"
  DART_SDK_DIR="${SDK_PREBUILTS_DIR}/${PREBUILT_TARGET}/dart-sdk"

  if [ ! -d "$DART_SDK_DIR" ]
  then
    echo "Prebuilt dart sdk for ${PREBUILT_TARGET} not found."
    echo "Note: You can specify your own path to a built dart sdk with the DART_SDK_DIR environment variable."
    exit 1
  fi

else
  if [ ! -d "$DART_SDK_DIR" ]
  then 
    echo "Explicitly specified dart SDK not found at ${DART_SDK_DIR}."
    exit 1
  fi
fi

WEB_UI_DIR="${FLUTTER_DIR}/lib/web_ui"
DEV_DIR="${WEB_UI_DIR}/dev"
DART_TOOL_DIR="${WEB_UI_DIR}/.dart_tool"
DART_PATH="$DART_SDK_DIR/bin/dart"
SNAPSHOT_PATH="${DART_TOOL_DIR}/felt.snapshot"
STAMP_PATH="${DART_TOOL_DIR}/felt.snapshot.stamp"
SCRIPT_PATH="${DEV_DIR}/felt.dart"
REVISION="$(cd "$FLUTTER_DIR"; git rev-parse HEAD)"

if [[ "$FELT_DEBUG" == "true" || "$FELT_DEBUG" == "1" ]]
then
  FELT_DEBUG_FLAGS="--enable-vm-service --pause-isolates-on-start"
fi

install_deps() {
  echo "Running \`dart pub get\` in 'engine/src/flutter/lib/web_ui'"
  (cd "$WEB_UI_DIR"; $DART_PATH pub get)

  echo "Running \`dart pub get\` in 'engine/src/flutter/web_sdk/web_engine_tester'"
  (cd "$FLUTTER_DIR/web_sdk/web_engine_tester"; $DART_PATH pub get)
}

if [[ $KERNEL_NAME == *"Darwin"* ]]
then
  echo "Running on MacOS. Will check the file and user limits."
  # Disable exit if the commands fails. We want to give more actionable
  # error message.
  set +e
  ULIMIT_FILES=`ulimit -n`
  # Increase the file limit if it is low. Note that these limits are changed
  # only for this script (for this shell). After felt execution is completed
  # no change is required to reset the original shell.
  if [[ $ULIMIT_FILES -lt 50000 ]]
  then
    echo "File limits too low increasing the file limits"
    # Get the max file limit.
    MAX_ULIMIT_FILES=`launchctl limit maxfiles | sed -e 's/^[[:space:]]*//' | sed 's/ \{1,\}/ /g' | cut -d' ' -f2`
    if [[ $MAX_ULIMIT_FILES -lt 50000 ]]
    then
      # Increase the maximum file limit.
      sudo launchctl limit maxfiles 50000 200000
    fi
    ERROR=$(ulimit -n 50000 2>&1 >/dev/null)
    if [[ ! -z $ERROR ]]
    then
      echo "Problem changing the file limit. Please try to reboot to use the higher limits. error: \n$ERROR" 1>&2
    fi
  fi
  ULIMIT_USER=`ulimit -u`
  # Increase the hard user limit if it is lower than 2048.
  if [[ $ULIMIT_USER -lt 4096 ]]
  then
    echo "User limits too low increasing the user limits"
    ERROR2=$(ulimit -u 4096 2>&1 >/dev/null)
    if [[ ! -z $ERROR2 ]]
    then
      echo "Problem changing the user limit. Please try to reboot to use the higher limits. error: \n$ERROR2" 1>&2
    fi
  fi
  # Set the value back to exit on non zero results.
  set -e
fi

if [[ "$FELT_USE_SNAPSHOT" == "false" || "$FELT_USE_SNAPSHOT" == "0" ]]; then
  echo "[Snapshot mode: off]"
  # Running without snapshot means there is high likelihood of local changes. In
  # that case, let's clear the snapshot to avoid any surprises.
  rm -f "$SNAPSHOT_PATH"
  rm -f "$STAMP_PATH"
  install_deps
  $DART_SDK_DIR/bin/dart $FELT_DEBUG_FLAGS "$DEV_DIR/felt.dart" $@
else
  # Create a new snapshot if any of the following is true:
  #  * SNAPSHOT_PATH is not a file, or
  #  * STAMP_PATH is not a file with nonzero size, or
  #  * Contents of STAMP_PATH is not our local git HEAD revision, or
  #  * pubspec.yaml last modified after pubspec.lock
  if [[ ! -f $SNAPSHOT_PATH || ! -s "$STAMP_PATH" || "$(cat "$STAMP_PATH")" != "$REVISION" || "$WEB_UI_DIR/pubspec.yaml" -nt "$WEB_UI_DIR/pubspec.lock" ]]; then
    echo "[Snapshot mode: on] (creating a new snapshot)"
    install_deps
    mkdir -p $DART_TOOL_DIR

    "$DART_SDK_DIR/bin/dart" --snapshot="$SNAPSHOT_PATH" --packages="$WEB_UI_DIR/.dart_tool/package_config.json" "$SCRIPT_PATH"
    echo "$REVISION" > "$STAMP_PATH"
  fi

  $DART_SDK_DIR/bin/dart $FELT_DEBUG_FLAGS --packages="$WEB_UI_DIR/.dart_tool/package_config.json" "$SNAPSHOT_PATH" $@
fi
