#!/usr/bin/env sh
set -eu

URL="${MODEL_GATEWAY_URL:-http://127.0.0.1:18080/ui/}"
HEALTH_URL="${MODEL_GATEWAY_HEALTH_URL:-http://127.0.0.1:18080/health}"

show_message() {
  title="$1"
  text="$2"
  if command -v zenity >/dev/null 2>&1; then
    zenity --info --title="$title" --text="$text" >/dev/null 2>&1 || true
  elif command -v kdialog >/dev/null 2>&1; then
    kdialog --title "$title" --msgbox "$text" >/dev/null 2>&1 || true
  else
    printf '%s\n%s\n' "$title" "$text"
  fi
}

run_as_root() {
  if [ "$(id -u)" = "0" ]; then
    "$@"
    return $?
  fi

  if command -v sudo >/dev/null 2>&1 && sudo -n true >/dev/null 2>&1; then
    sudo -n "$@"
    return $?
  fi

  if command -v pkexec >/dev/null 2>&1 &&
     { [ -n "${DISPLAY:-}" ] || [ -n "${WAYLAND_DISPLAY:-}" ]; }; then
    pkexec "$@"
    return $?
  fi

  if command -v sudo >/dev/null 2>&1 && [ -t 0 ]; then
    sudo "$@"
    return $?
  fi

  return 1
}

restart_service() {
  run_as_root systemctl reset-failed model-gateway.service >/dev/null 2>&1 || true
  run_as_root systemctl restart model-gateway.service
}

health_ready() {
  command -v curl >/dev/null 2>&1 && curl -fsS "$HEALTH_URL" >/dev/null 2>&1
}

fragment="$(systemctl show model-gateway.service -p FragmentPath --value 2>/dev/null || true)"
case "$fragment" in
  /opt/kare/*)
    if command -v uni-model-infer-repair-kare >/dev/null 2>&1; then
      run_as_root uni-model-infer-repair-kare --restart-if-changed || true
    fi
    ;;
esac

if ! systemctl is-active --quiet model-gateway.service 2>/dev/null; then
  show_message "Uni Model Infer" "正在启动统一模型推理服务。"
  if ! restart_service; then
    show_message "Uni Model Infer" "无法启动 model-gateway 服务，请在终端执行：sudo systemctl status model-gateway"
    exit 1
  fi
fi

ready=false
for _ in 1 2 3 4 5; do
  if health_ready; then
    ready=true
    break
  fi
  sleep 1
done

if [ "$ready" != "true" ]; then
  show_message "Uni Model Infer" "服务未通过健康检查，正在尝试重启。"
  if restart_service; then
    for _ in 1 2 3 4 5 6 7 8 9 10; do
      if health_ready; then
        ready=true
        break
      fi
      sleep 1
    done
  fi
fi

if [ "$ready" != "true" ]; then
  show_message "Uni Model Infer" "服务已尝试启动，但健康检查未通过。请查看：sudo journalctl -u model-gateway -n 100"
  exit 1
fi

if command -v xdg-open >/dev/null 2>&1; then
  xdg-open "$URL" >/dev/null 2>&1 &
else
  show_message "Uni Model Infer" "请在浏览器打开：$URL"
fi
