#!/bin/bash
set -e
set -m

# This is a wrapper script that runs the specific version of Android Studio that is recommended for developing in this repository.
# (This serves a similar purpose to gradlew)


function getStudioUrl() {
  propertiesFile="${scriptDir}/buildSrc/studio_versions.properties"
  version="$(grep "studio_version=" ${propertiesFile} | sed 's/[^=]*=//')"
  ideaMajorVersion="$(grep "idea_major_version=" ${propertiesFile} | sed 's/[^=]*=//')"
  buildNumber="$(grep "studio_build_number=" ${propertiesFile} | sed 's/[^=]*=//')"
  osName="$1"
  extension=""
  if [ "${osName}" == "linux" ]; then
    extension="tar.gz"
  else
    extension="zip"
  fi
  studioUrl="https://dl.google.com/dl/android/studio/ide-zips/${version}/android-studio-ide-${ideaMajorVersion}.${buildNumber}-${osName}.${extension}"
  echo "${studioUrl}"
}

acceptsLicenseAgreement="false"
runStudio="true"
scriptDir="$(cd $(dirname $0) && pwd)"
projectDir=$scriptDir
tempDir="${scriptDir}/studio"
function getOsName() {
  unameOutput="$(uname)"
  osName=""
  if [ "${unameOutput}" == "Linux" ]; then
    osName="linux"
  else
    osName="mac"
  fi
  echo "${osName}"
}
osName="$(getOsName)"
studioUrl="$(getStudioUrl $osName)"
studioDestName="$(basename ${studioUrl})"
studioZipPath="${tempDir}/${studioDestName}"
studioUnzippedPath="$(echo ${studioZipPath} | sed 's/\.zip$//; s/\.tar.gz$//')"

function parseOptions() {
  while :; do
    case "$1" in
      -y|--accept-license-agreement)
        acceptsLicenseAgreement="true"
        ;;
      --update-only)
        runStudio="false"
        ;;
      *)
        break
    esac

    shift
  done
}


function downloadFile() {
  fromUrl="$1"
  destPath="$2"
  tempPath="${destPath}.tmp"
  if [ -f "${destPath}" ]; then
    read -r -n 1 -p "File already exists. Do you want to delete and re-download? [Y/n]? " reply

    if [ ! -z "${reply}" ]; then
      # Fix missing newline
      echo
    fi

    case "${reply}" in
      [yY]|"")
        rm "${destPath}"
        ;;
      *)
    esac
  fi

  if [ -f "${destPath}" ]; then
    echo "Using existing file from ${destPath}"
  else
    echo "Downloading ${fromUrl} to ${destPath}"
    curl "${fromUrl}" > "${tempPath}"
    mv "${tempPath}" "${destPath}"
  fi
}

function findStudioMacAppPath() {
  echo "$(find "${studioUnzippedPath}" -type d -depth 1 -name "Android Studio*.app")"
}

function getLicensePath() {
  if [ "${osName}" == "mac" ]; then
    appPath="$(findStudioMacAppPath)"
    echo "${appPath}/Contents/Resources/LICENSE.txt"
  else
    echo "${studioUnzippedPath}/android-studio/LICENSE.txt"
  fi
}

function checkLicenseAgreement() {
  # TODO: Is there a more official way to check that the user accepts the license?

  licenseAcceptedPath="${studioUnzippedPath}/STUDIOW_LICENSE_ACCEPTED"

  if [ ! -f "${licenseAcceptedPath}" ]; then
    if [ "${acceptsLicenseAgreement}" == "true" ]; then
      touch "${licenseAcceptedPath}"
    else
      read -r -n 1 -p "Do you accept the license agreement at $(getLicensePath) [Y/n]? " reply

      if [ ! -z "${reply}" ]; then
        # Fix missing newline
        echo
      fi

      case "${reply}" in
        [yY]|"")
          touch "${licenseAcceptedPath}"
          ;;
        *)
          exit 1
          ;;
      esac
    fi
  fi
}

# Temporary fix. Remove this after fixing b/135183535
function updateJvmHeapSize() {
  if [ "${osName}" == "mac" ]; then
    sed -i '' 's/-Xmx.*/-Xmx8g/' "$(findStudioMacAppPath)/Contents/bin/studio.vmoptions"
  else
    sed -i 's/-Xmx.*/-Xmx8g/' "${studioUnzippedPath}/android-studio/bin/studio64.vmoptions"
    sed -i 's/-Xmx.*/-Xmx4g/' "${studioUnzippedPath}/android-studio/bin/studio.vmoptions"
  fi
}

function updateStudio() {
  # skip if already up-to-date
  if stat "${studioUnzippedPath}" >/dev/null 2>/dev/null; then
    # already up-to-date
    return
  fi

  mkdir -p "${tempDir}"
  downloadFile "${studioUrl}" "${studioZipPath}"
  echo

  echo "Removing previous installations"
  ls "${tempDir}" | grep -v "^${studioDestName}\$" | sed "s|^|${tempDir}/|" | xargs rm -rf

  echo "Unzipping"
  if [ ${studioZipPath: -7} == ".tar.gz" ]; then
    mkdir "${studioUnzippedPath}"
    tar -xvf "${studioZipPath}" -C "${studioUnzippedPath}"
  else
    unzip "${studioZipPath}" -d "${studioUnzippedPath}"
  fi
}

function ensureLocalPropertiesUpdated() {
  testPath="${projectDir}/local.properties"
  populaterCommand="./gradlew help"
  if [ ! -f "${testPath}" ]; then
    cd "$scriptDir"
    echo "Creating $testPath by running '$populaterCommand'"
    eval $populaterCommand
  fi
}

# ANDROID_LINT_NULLNESS_IGNORE_DEPRECATED environment variable prevents Studio from showing IDE
# inspection warnings for nullability issues, if the context is deprecated
# This environment variable is consumed by InteroperabilityDetector.kt

function runStudioLinux() {
  studioPath="${studioUnzippedPath}/android-studio/bin/studio.sh"
  echo "$studioPath &"
  env STUDIO_PROPERTIES="${projectDir}/development/studio/idea.properties" \
      STUDIO_VM_OPTIONS="${projectDir}/development/studio/studio.vmoptions" \
      ANDROID_LINT_NULLNESS_IGNORE_DEPRECATED="true" \
      "${studioPath}" "${projectDir}" &
}

function runStudioMac() {
  appPath="$(findStudioMacAppPath)"
  echo "open ${appPath}"
  env STUDIO_PROPERTIES="${projectDir}/development/studio/idea.properties" \
      STUDIO_VM_OPTIONS="${projectDir}/development/studio/studio.vmoptions" \
      ANDROID_LINT_NULLNESS_IGNORE_DEPRECATED="true" \
      open -a "${appPath}" "${projectDir}"
}

function runStudio() {
  updateJvmHeapSize
  if [ "${osName}" == "mac" ]; then
    runStudioMac
  else
    runStudioLinux
  fi
}

function main() {
  parseOptions "$@"
  updateStudio
  if [ "${runStudio}" == "true" ]; then
    checkLicenseAgreement
    ensureLocalPropertiesUpdated
    runStudio
  fi
}

main "$@"
