#!/usr/bin/env bash

set -euo pipefail

SNP_VERSION="1.0.0-alpha"
SNP_INSTALL_TOKEN="${1:-}"
SNP_DOWNLOAD_BASE_URL="${SNP_DOWNLOAD_BASE_URL:-https://panel.puxinnan.com/download}"
SNP_RELEASES_URL="${SNP_RELEASES_URL:-$SNP_DOWNLOAD_BASE_URL/releases.json}"
SNP_INSTALLER_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
SNP_LIB_DIR="$SNP_INSTALLER_DIR/lib"
SNP_TMP_LIB_DIR="/tmp/smart-node-installer-lib-$$"

helper_files=(
  utils.sh
  check_system.sh
  init_dirs.sh
  download_release.sh
  init_security.sh
  write_config.sh
  init_service.sh
)

download_helper() {
  local helper="$1"
  mkdir -p "$SNP_TMP_LIB_DIR"
  local target="$SNP_TMP_LIB_DIR/$helper"
  local url="$SNP_DOWNLOAD_BASE_URL/lib/$helper"

  if command -v curl >/dev/null 2>&1; then
    curl -fsSL "$url" -o "$target"
  elif command -v wget >/dev/null 2>&1; then
    wget -q -O "$target" "$url"
  else
    printf '安装中止：缺少 %s，且无法使用 curl/wget 下载 helper。\n' "$helper" >&2
    exit 1
  fi

  printf '%s' "$target"
}

load_helper() {
  local helper="$1"
  local path="$SNP_LIB_DIR/$helper"
  if [ ! -f "$path" ]; then
    path="$(download_helper "$helper")"
  fi

  # shellcheck disable=SC1090
  . "$path"
}

for helper in "${helper_files[@]}"; do
  load_helper "$helper"
done

main() {
  trap 'rm -rf "$SNP_TMP_LIB_DIR"' EXIT

  if [ -z "$SNP_INSTALL_TOKEN" ]; then
    snp_fail "缺少 install_token，例如：bash install_panel.sh ed8484bec"
  fi

  snp_log "开始安装 Smart Node Panel Alpha"
  snp_check_system
  snp_init_dirs
  snp_download_release
  snp_init_security
  snp_write_config
  snp_init_service

  cat <<EOF

Smart Node Panel 安装成功

面板地址：
https://$SNP_SERVER_IP:$SNP_PANEL_PORT/$SNP_SECURE_PATH

用户名：
admin

初始密码：
$SNP_ADMIN_PASSWORD

安装目录：
$SNP_INSTALL_DIR

配置文件：
$SNP_PANEL_CONFIG

管理命令：
smartnode status
smartnode restart
smartnode logs
smartnode info
smartnode uninstall

当前模式：
只读检测模式

重要提示：
当前 Alpha 版本不会自动安装 Nginx/PHP/MariaDB。
请先在测试服务器验证，不要安装到生产服务器。
初始密码明文仅首次保存到 $SNP_INITIAL_PASSWORD_FILE，请登录后尽快删除该文件。

EOF
}

main "$@"
