#!/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)
#
# NOTE: if you are changing this file, consider applying the changes to ./ui/studiow, used for the Compose project.


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 "$@"
