#!/usr/bin/env bash
# apm-store-handler
# 用途：作为 apmstore:// 协议的处理程序。

set -e

URL="$1"

log() { echo "[apm-store-handler] $*" >&2; }

if [ -z "$URL" ]; then
  log "没有传入 URL 参数，退出。"
  exit 2
fi

# 解析 URL，例如 apmstore://install?pkg=foo 或 apmstore://action?cmd=update
# 先去掉前缀 apmstore://
url_no_proto="${URL#apmstore://}"

# 将 path 与 query 分离
path="${url_no_proto%%\?*}"
query="${url_no_proto#*\?}"
if [ "$query" = "$url_no_proto" ]; then
  query=""
fi

# URL decode 函数（纯 bash 实现）
url_decode() {
  local encoded_str="$1"
  # 先处理 + 号
  encoded_str="${encoded_str//+/ }"
  # 处理 %XX 序列
  printf '%b' "${encoded_str//%/\\x}"
}

# 解析查询参数值
get_query_val() {
  local key="$1"
  local q="$query"
  
  # 如果查询字符串为空，直接返回空
  [ -z "$q" ] && return
  
  # 遍历所有键值对
  local k v
  while [ -n "$q" ]; do
    # 获取第一个键值对
    kv="${q%%&*}"
    k="${kv%%=*}"
    v="${kv#*=}"
    
    # 如果找到匹配的 key，进行 URL 解码并返回
    if [ "$k" = "$key" ]; then
      url_decode "$v"
      return
    fi
    
    # 如果已经是最后一个键值对，退出循环
    if [ "$q" = "$kv" ]; then
      break
    else
      # 移除已处理的键值对
      q="${q#*&}"
    fi
  done
  
  echo ""
}

case "$path" in
  install)
    pkg=$(get_query_val "pkg")
    # basic sanitize: 允许字母数字、点、下划线、连字符、冒号、斜杠（少量允许），其他拒绝
    if [ -z "$pkg" ]; then
      log "install action 但没有 pkg 参数：$URL"
      exit 3
    fi
    # 仅允许安全字符，避免命令注入
    if [[ ! "$pkg" =~ ^[A-Za-z0-9_.:-]+$ ]]; then
      log "非法的包名内容，拒绝执行: '$pkg'"
      exit 4
    fi
    log "请求安装包: $pkg"
    # 异步执行安装（不阻塞桌面）
    if [ -x /usr/bin/apm-installer ]; then
      /usr/bin/apm-installer --install "$pkg"
      exit $?
    else
      log "/usr/bin/apm-installer 未找到或不可执行。"
      exit 5
    fi
    ;;
  action)
    cmd=$(get_query_val "cmd")
    if [ -z "$cmd" ]; then
      log "action 但没有 cmd 参数：$URL"
      exit 6
    fi
    case "$cmd" in
      update)
        log "触发 apm-update-tool"
        if [ -x /usr/bin/apm-update-tool ]; then
            /usr/bin/apm-update-tool 
          exit $?
        else
          log "/usr/bin/apm-update-tool 未找到或不可执行。"
          exit 7
        fi
        ;;
      list)
        log "触发 apm-installer --list"
        if [ -x /usr/bin/apm-installer ]; then
          /usr/bin/apm-installer --list 
          exit $?
        else
          log "/usr/bin/apm-installer 未找到或不可执行。"
          exit 8
        fi
        ;;
      *)
        log "未知 action cmd: $cmd"
        exit 9
        ;;
    esac
    ;;
  *)
    # 兼容：apmstore://install/<pkg> 形式
    if [[ "$path" =~ ^install/([A-Za-z0-9_.:-]+)$ ]]; then
      pkg="${BASH_REMATCH[1]}"
      log "兼容路径安装：$pkg"
      if [ -x /usr/bin/apm-installer ]; then
        /usr/bin/apm-installer --install "$pkg" 
        exit $?
      else
        log "/usr/bin/apm-installer 未找到或不可执行。"
        exit 10
      fi
    fi
    log "无法识别的 apmstore 路径: $path"
    exit 11
    ;;
esac