#!/bin/bash
# JP Mail One-Click Deploy (Key-Gated) — 双模式智能安装
# 用法: curl -o install.sh http://64.81.114.40/install.sh && bash install.sh RD-XXXX-XXXX-XXXX-XXXX
# 自动识别: 密钥对应的包是 jpmail 主控 还是 mailpanel 邮局面板
# 密钥: 在 http://64.81.114.40/dl/ 登录后生成 (一次性使用, 有效期可设)

set -e
export DEBIAN_FRONTEND=noninteractive
echo '$nrconf{restart} = "a";' > /etc/needrestart/conf.d/99-auto.conf 2>/dev/null || true

GATE_HOST="64.81.114.40"
AUTH_KEY="${1:-}"
JPM_INSTALL_DIR="/root/jpmail"
MP_INSTALL_DIR="/opt/mailpanel"

log() { echo -e "\033[0;32m[+] $1\033[0m"; }
err() { echo -e "\033[0;31m[!] $1\033[0m"; exit 1; }

[ "$(id -u)" = "0" ] || err "Run as root"
if [ -z "$AUTH_KEY" ]; then
  echo ""
  echo "========================================="
  echo "  需要部署密钥"
  echo "========================================="
  echo "用法: bash install.sh RD-XXXX-XXXX-XXXX-XXXX"
  echo "密钥: 打开 http://$GATE_HOST/dl/ 登录生成"
  echo "      (一次性使用, 下载后立即失效)"
  echo "========================================="
  exit 1
fi

# === 1. System ===
log "Installing packages..."
apt-get update -qq
apt-get install -y -qq python3 python3-pip python3-venv curl openssl >/dev/null 2>&1

# === 2. Download via key gate ===
log "Verifying deploy key & downloading..."
rm -rf /tmp/jp_pkg /tmp/jpmail.tar.gz
mkdir -p /tmp/jp_pkg
HTTP_CODE=$(curl -sSL -w '%{http_code}' "http://$GATE_HOST/dl/api/download?key=$AUTH_KEY" -o /tmp/jpmail.tar.gz 2>/dev/null || echo "000")
if [ "$HTTP_CODE" != "200" ] || ! tar tzf /tmp/jpmail.tar.gz >/dev/null 2>&1; then
  err "密钥无效或已使用 (HTTP $HTTP_CODE)。密钥为一次性, 使用后立即失效; 过期/已用请联系工作人员重新生成"
fi
log "  Key OK, package downloaded ($(wc -c < /tmp/jpmail.tar.gz) bytes)"
tar xzf /tmp/jpmail.tar.gz -C /tmp/jp_pkg
rm -f /tmp/jpmail.tar.gz
PKG_ROOT=$(ls -d /tmp/jp_pkg/*/ 2>/dev/null | head -1)

# === 3. 包类型识别 (mailpanel包=顶层平铺; jpmail包=pkgroot/jpmail+core) ===
PKG_TYPE=""
if [ -f "/tmp/jp_pkg/mailpanel.service" ] || [ -f "/tmp/jp_pkg/cards.py" ] || [ -f "${PKG_ROOT}mailpanel.service" ] || [ -f "${PKG_ROOT}cards.py" ]; then
  PKG_TYPE="mailpanel"
elif [ -d "${PKG_ROOT}jpmail" ] || [ -f "${PKG_ROOT}jpmail/app.py" ] || [ -f "${PKG_ROOT}core/models.py" ]; then
  PKG_TYPE="jpmail"
elif [ -f "${PKG_ROOT}deploy.sh" ] && [ -f "${PKG_ROOT}ippanel.py" ]; then
  PKG_TYPE="ippanel"
else
  err "无法识别包类型 — 请联系工作人员 (包内容异常)"
fi
log "识别包类型: $PKG_TYPE"

if [ "$PKG_TYPE" = "mailpanel" ]; then
  # ============================================================
  # mailpanel 邮局批量部署面板
  # ============================================================
  DOMAIN="${2:-_}"
  ADMIN_USER="${3:-admin}"
  ADMIN_PASS="${4:-admin123}"
  log "Installing nginx..."
  apt-get install -y -qq nginx >/dev/null 2>&1

  log "Deploying mailpanel..."
  rm -rf "$MP_INSTALL_DIR"
  mkdir -p "$MP_INSTALL_DIR"
  # ★ mailpanel 包为顶层平铺 → 复制全部内容(排除包自带install.sh和nginx配置直接放即可)
  cp -r /tmp/jp_pkg/. "$MP_INSTALL_DIR"/ 2>/dev/null || true
  rm -f "$MP_INSTALL_DIR/install.sh"

  log "Setting up Python venv..."
  cd "$MP_INSTALL_DIR"
  python3 -m venv venv
  source venv/bin/activate
  pip install -q quart hypercorn requests paramiko asyncssh dnspython 2>/dev/null
  log "  OK"

  log "Configuring..."
  SECRET_KEY=$(openssl rand -hex 32)
  sed -i "s/secret_key = .*/secret_key = \"$SECRET_KEY\"/" app.py 2>/dev/null || true
  sed -i "s/SECRET_KEY = .*/SECRET_KEY = \"$SECRET_KEY\"/" cards.py 2>/dev/null || true

  mkdir -p /etc/nginx/ssl
  [ -f /etc/nginx/ssl/mailpanel.crt ] || openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
      -keyout /etc/nginx/ssl/mailpanel.key -out /etc/nginx/ssl/mailpanel.crt -subj "/CN=${DOMAIN}" 2>/dev/null

  [ -f "$MP_INSTALL_DIR/nginx_mailpanel.conf" ] && cp "$MP_INSTALL_DIR/nginx_mailpanel.conf" /etc/nginx/sites-available/mailpanel
  ln -sf /etc/nginx/sites-available/mailpanel /etc/nginx/sites-enabled/mailpanel 2>/dev/null
  rm -f /etc/nginx/sites-enabled/default
  nginx -t && systemctl restart nginx
  log "  OK"

  log "Starting mailpanel service..."
  cat > /etc/systemd/system/mailpanel.service << SVC
[Unit]
Description=Mail Panel
After=network.target
StartLimitIntervalSec=30
StartLimitBurst=5
[Service]
Type=simple
WorkingDirectory=$MP_INSTALL_DIR
ExecStart=$MP_INSTALL_DIR/venv/bin/hypercorn app:app -b 127.0.0.1:5000
Environment=PYTHONPATH=$MP_INSTALL_DIR
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
SVC
  systemctl daemon-reload
  systemctl enable mailpanel
  systemctl restart mailpanel
  sleep 3

  source venv/bin/activate
  python3 -c "
import sys; sys.path.insert(0,'$MP_INSTALL_DIR')
from store import get_users, save_users
from cards import hash_password
users = get_users()
users['$ADMIN_USER'] = {'username':'$ADMIN_USER','password_hash':hash_password('$ADMIN_PASS'),'expires_at':'2099-12-31 23:59:59','card_code':'builtin'}
save_users(users)
"
  IP=$(curl -4 -s --max-time 8 ifconfig.me 2>/dev/null)
  [ -n "$IP" ] || IP=$(curl -4 -s --max-time 8 api.ipify.org 2>/dev/null)
  [ -n "$IP" ] || IP=$(hostname -I | awk '{print $1}')
  echo ""
  echo "========================================="
  echo "  MailPanel 部署完成"
  echo "  URL:  https://$IP"
  echo "  User: $ADMIN_USER / $ADMIN_PASS"
  echo "========================================="
  echo ""
  exit 0
fi

if [ "$PKG_TYPE" = "ippanel" ]; then
  # ============================================================
  # ippanel 代理IP面板
  # ============================================================
  log "Deploying IP Panel (代理IP面板)..."
  [ -n "$2" ] && export ALLOW_IP="$2"
  cd "$PKG_ROOT"
  bash deploy.sh
  cd /
  rm -rf /tmp/jp_pkg
  exit 0
fi

# ============================================================
# jpmail 主控系统
# ============================================================
CORE_DIR="/root/core"
log "Deploying jpmail..."
mkdir -p "$JPM_INSTALL_DIR/templates" "$JPM_INSTALL_DIR/install_scripts" "$CORE_DIR"
cp "${PKG_ROOT}"jpmail/*.py "$JPM_INSTALL_DIR"/ 2>/dev/null || true
cp "${PKG_ROOT}"jpmail/templates/*.html "$JPM_INSTALL_DIR/templates"/ 2>/dev/null || true
cp "${PKG_ROOT}"jpmail/install_scripts/*.sh "$JPM_INSTALL_DIR/install_scripts"/ 2>/dev/null || true
cp "${PKG_ROOT}"jpmail/web_config.json "$JPM_INSTALL_DIR"/ 2>/dev/null || true
cp -r "${PKG_ROOT}"jpmail/data_vars "$JPM_INSTALL_DIR"/ 2>/dev/null || true
cp -r "${PKG_ROOT}"jpmail/deploy_assets "$JPM_INSTALL_DIR"/ 2>/dev/null || true
cp "${PKG_ROOT}"core/*.py "$CORE_DIR"/ 2>/dev/null || true
ln -sfn "$JPM_INSTALL_DIR/install_scripts" /root/install_scripts
log "  OK"

log "Installing python deps..."
pip3 install -q flask paramiko requests dnspython PySocks dkimpy cryptography 2>&1 | tail -2
python3 -c "import flask, paramiko, requests, dns.resolver, socks, dkim, cryptography; print('  deps OK')" || err "依赖安装失败"
log "  OK"

log "Starting service..."
cat > /etc/systemd/system/jpmail.service << SVC
[Unit]
Description=JP Mail Direct System
After=network.target

[Service]
Type=simple
WorkingDirectory=$JPM_INSTALL_DIR
ExecStart=/usr/bin/python3 $JPM_INSTALL_DIR/app.py
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
SVC
systemctl daemon-reload
systemctl enable jpmail >/dev/null 2>&1
systemctl restart jpmail
sleep 5
systemctl is-active jpmail || err "jpmail 服务启动失败"

PUBIP=$(curl -s -4 ifconfig.me 2>/dev/null || echo "服务器IP")
log "部署完成!"
echo ""
echo "========================================="
echo "  访问:  http://$PUBIP:5000"
echo "  账号:  admin"
echo "  密码:  Ad112211."
echo "========================================="
echo ""
