#!/usr/bin/env bash
# phone_launch.sh - Launch an Android app by name alias or package name
#
# Usage:
#   bash phone_launch.sh <app_name_or_package> [options]
#
# Options:
#   -d DEVICE_ID    Target specific device
#   -l              List all known app aliases
#   -q              Quiet mode
#
# Supports common Chinese app aliases (case-insensitive):
#   wechat, wecom, meituan, ctrip, xiaohongshu/xhs, bilibili,
#   baidu, boss/bosszhipin, doubao, taobao, alipay, jd, didi,
#   douyin/tiktok, kuaishou, zhihu, ele, pinduoduo/pdd, gaode/amap
#
# Examples:
#   bash phone_launch.sh wechat
#   bash phone_launch.sh com.tencent.mm
#   bash phone_launch.sh -l

set -eo pipefail

DEVICE=""
QUIET=false
LIST=false

# Parse options manually to allow "phone_launch.sh <app> -d DEV" order
ARGV=()
i=1
while [ $i -le $# ]; do
    arg="${!i}"
    case "$arg" in
        -d) i=$((i+1)); DEVICE="${!i}" ;;
        -l) LIST=true ;;
        -q) QUIET=true ;;
        -h|--help) head -21 "$0" | tail -16; exit 0 ;;
        -*) echo "Unknown option: $arg" >&2; exit 1 ;;
        *) ARGV+=("$arg") ;;
    esac
    i=$((i+1))
done

# App alias -> package name lookup (bash 3.2 compatible)
resolve_app() {
    local app
    app=$(echo "$1" | tr '[:upper:]' '[:lower:]')
    case "$app" in
        wechat|weixin)       echo "com.tencent.mm" ;;
        wecom|qiyeweixin)    echo "com.tencent.wework" ;;
        meituan)             echo "com.sankuai.meituan" ;;
        ctrip|xiecheng)      echo "ctrip.android.view" ;;
        xiaohongshu|xhs)     echo "com.xingin.xhs" ;;
        bilibili)            echo "tv.danmaku.bili" ;;
        baidu)               echo "com.baidu.searchbox" ;;
        boss|bosszhipin)     echo "com.hpbr.bosszhipin" ;;
        doubao)              echo "com.larus.nova" ;;
        taobao)              echo "com.taobao.taobao" ;;
        alipay|zhifubao)     echo "com.eg.android.AlipayGphone" ;;
        jd|jingdong)         echo "com.jingdong.app.mall" ;;
        didi)                echo "com.sdu.didi.psnger" ;;
        douyin|tiktok)       echo "com.ss.android.ugc.aweme" ;;
        kuaishou)            echo "com.smile.gifmaker" ;;
        zhihu)               echo "com.zhihu.android" ;;
        ele|eleme)           echo "me.ele" ;;
        pinduoduo|pdd)       echo "com.xunmeng.pinduoduo" ;;
        gaode|amap)          echo "com.autonavi.minimap" ;;
        qq)                  echo "com.tencent.mobileqq" ;;
        wps)                 echo "cn.wps.moffice_eng" ;;
        settings)            echo "com.android.settings" ;;
        camera)              echo "com.android.camera" ;;
        chrome)              echo "com.android.chrome" ;;
        calendar)            echo "com.google.android.calendar" ;;
        maps)                echo "com.google.android.apps.maps" ;;
        phone)               echo "com.android.dialer" ;;
        contacts)            echo "com.android.contacts" ;;
        messages)            echo "com.google.android.apps.messaging" ;;
        gallery)             echo "com.miui.gallery" ;;
        files)               echo "com.android.fileexplorer" ;;
        *)                   echo "" ;;
    esac
}

list_aliases() {
    cat <<'ALIASES'
Known app aliases:
  alipay/zhifubao  -> com.eg.android.AlipayGphone
  amap/gaode       -> com.autonavi.minimap
  baidu            -> com.baidu.searchbox
  bilibili         -> tv.danmaku.bili
  boss/bosszhipin  -> com.hpbr.bosszhipin
  calendar         -> com.google.android.calendar
  camera           -> com.android.camera
  chrome           -> com.android.chrome
  contacts         -> com.android.contacts
  ctrip/xiecheng   -> ctrip.android.view
  didi             -> com.sdu.didi.psnger
  doubao           -> com.larus.nova
  douyin/tiktok    -> com.ss.android.ugc.aweme
  ele/eleme        -> me.ele
  files            -> com.android.fileexplorer
  gallery          -> com.miui.gallery
  jd/jingdong      -> com.jingdong.app.mall
  kuaishou         -> com.smile.gifmaker
  maps             -> com.google.android.apps.maps
  meituan          -> com.sankuai.meituan
  messages         -> com.google.android.apps.messaging
  phone            -> com.android.dialer
  pinduoduo/pdd    -> com.xunmeng.pinduoduo
  qq               -> com.tencent.mobileqq
  settings         -> com.android.settings
  taobao           -> com.taobao.taobao
  wechat/weixin    -> com.tencent.mm
  wecom/qiyeweixin -> com.tencent.wework
  wps              -> cn.wps.moffice_eng
  xiaohongshu/xhs  -> com.xingin.xhs
  zhihu            -> com.zhihu.android
ALIASES
}

if $LIST; then
    list_aliases
    exit 0
fi

if [ ${#ARGV[@]} -eq 0 ]; then
    echo "Usage: $0 <app_name_or_package> [-d device] [-l] [-q]" >&2
    exit 1
fi

APP_INPUT="${ARGV[0]}"

ADB_CMD="adb"
if [ -n "$DEVICE" ]; then
    ADB_CMD="adb -s $DEVICE"
fi

info() { $QUIET || echo "[phone_launch] $*" >&2; }

# Resolve package name
PACKAGE=$(resolve_app "$APP_INPUT")
if [ -n "$PACKAGE" ]; then
    info "Resolved '$APP_INPUT' -> $PACKAGE"
elif echo "$APP_INPUT" | grep -q '\.'; then
    PACKAGE="$APP_INPUT"
    info "Using package name directly: $PACKAGE"
else
    # Try fuzzy search on device
    info "Unknown alias '$APP_INPUT', searching on device..."
    MATCHES=$($ADB_CMD shell pm list packages | grep -i "$APP_INPUT" | sed 's/package://' || true)
    if [ -z "$MATCHES" ]; then
        echo "ERROR: No package found matching '$APP_INPUT'" >&2
        echo "Use -l to list known aliases, or provide full package name" >&2
        exit 1
    fi
    PACKAGE=$(echo "$MATCHES" | head -1 | tr -d '\r')
    info "Found package: $PACKAGE"
fi

# Launch the app
info "Launching $PACKAGE..."
$ADB_CMD shell monkey -p "$PACKAGE" -c android.intent.category.LAUNCHER 1 >/dev/null 2>&1

sleep 1
info "Done."
echo "$PACKAGE"
