#!/usr/bin/env bash
set -euo pipefail

SDK_ROOT="${ANDROID_HOME:-${ANDROID_SDK_ROOT:-$HOME/Android/Sdk}}"
EMULATOR_BIN="${SDK_ROOT}/emulator/emulator"
AVD_MANAGER="${SDK_ROOT}/cmdline-tools/latest/bin/avdmanager"
SDK_MANAGER="${SDK_ROOT}/cmdline-tools/latest/bin/sdkmanager"
PACKAGE="${BILLING_EMULATOR_PACKAGE:-system-images;android-33;google_apis_playstore;x86_64}"
AVD_NAME="${BILLING_EMULATOR_AVD:-yorvana_billing_pixel2api33_play}"
AVD_HOME="${BILLING_EMULATOR_AVD_HOME:-$PWD/.tmp/android-avd}"
SERIAL="${BILLING_EMULATOR_SERIAL:-emulator-5554}"
WEB_HOST="${BILLING_EMULATOR_BIND:-127.0.0.1}"
WEB_PORT="${BILLING_EMULATOR_PORT:-8090}"
LOG_FILE="${BILLING_EMULATOR_LOG:-$PWD/.tmp/billing-emulator.log}"

require_command() {
  if ! command -v "$1" >/dev/null 2>&1; then
    echo "Missing required command: $1" >&2
    exit 1
  fi
}

require_file() {
  if [[ ! -x "$1" ]]; then
    echo "Missing executable: $1" >&2
    exit 1
  fi
}

adb_state() {
  adb devices | awk -v serial="$SERIAL" '$1 == serial { print $2 }'
}

wait_for_device() {
  local deadline=$((SECONDS + 180))
  while (( SECONDS < deadline )); do
    if [[ "$(adb_state)" == "device" ]]; then
      return 0
    fi
    sleep 2
  done
  echo "Timed out waiting for $SERIAL to become an ADB device." >&2
  echo "See $LOG_FILE for emulator output." >&2
  return 1
}

wait_for_boot() {
  local deadline=$((SECONDS + 180))
  while (( SECONDS < deadline )); do
    if [[ "$(adb -s "$SERIAL" shell getprop sys.boot_completed 2>/dev/null | tr -d '\r')" == "1" ]]; then
      return 0
    fi
    sleep 2
  done
  echo "Timed out waiting for Android boot completion on $SERIAL." >&2
  echo "See $LOG_FILE for emulator output." >&2
  return 1
}

host_urls() {
  if [[ "$WEB_HOST" == "0.0.0.0" ]]; then
    hostname -I 2>/dev/null | tr ' ' '\n' | awk -v port="$WEB_PORT" 'NF { print "  http://" $1 ":" port "/" }'
  else
    echo "  http://${WEB_HOST}:${WEB_PORT}/"
  fi
}

require_command adb
require_command awk
require_command hostname
require_file "$EMULATOR_BIN"
require_file "$AVD_MANAGER"
require_file "$SDK_MANAGER"

mkdir -p "$AVD_HOME" "$(dirname "$LOG_FILE")"
export ANDROID_AVD_HOME="$AVD_HOME"

if ! "$SDK_MANAGER" --list_installed | grep -Fq "$PACKAGE"; then
  echo "Installing $PACKAGE"
  yes | "$SDK_MANAGER" "$PACKAGE"
fi

if ! "$EMULATOR_BIN" -list-avds | grep -Fxq "$AVD_NAME"; then
  echo "Creating AVD $AVD_NAME"
  printf 'no\n' | "$AVD_MANAGER" create avd --force --name "$AVD_NAME" --package "$PACKAGE" --device "pixel_2"
fi

if [[ "$(adb_state)" != "device" ]]; then
  echo "Starting $AVD_NAME with host GPU acceleration"
  "$EMULATOR_BIN" "@${AVD_NAME}" -no-window -gpu host -no-audio -no-snapshot-load >"$LOG_FILE" 2>&1 &
fi

wait_for_device
wait_for_boot

adb -s "$SERIAL" shell monkey -p com.android.vending 1 >/dev/null 2>&1 || true

cat <<EOF
Billing Play Store emulator is ready.

Open one of:
$(host_urls)

ADB serial: $SERIAL
AVD home: $AVD_HOME
Emulator log: $LOG_FILE
EOF

exec /usr/bin/env python3 tools/billing/adb_web_control.py --serial "$SERIAL" --host "$WEB_HOST" --port "$WEB_PORT"
