#!/bin/bash
# ═══════════════════════════════════════════════════════════════
#  ExperionCrawler — Ubuntu 서버 배포 스크립트
#  사용법: sudo bash deploy.sh
# ═══════════════════════════════════════════════════════════════

set -e

APP_NAME="experioncrawler"
APP_DIR="/opt/ExperionCrawler"
SERVICE_USER="www-data"
DOTNET_MIN="8.0"

echo ""
echo "╔══════════════════════════════════════╗"
echo "║   ExperionCrawler 배포 스크립트      ║"
echo "╚══════════════════════════════════════╝"
echo ""

# ── 1. .NET 8 설치 확인 ─────────────────────────────────────────
echo "▶ .NET SDK 확인..."
if ! command -v dotnet &> /dev/null; then
  echo "  .NET이 설치되어 있지 않습니다. 설치를 시작합니다..."
  wget -q https://packages.microsoft.com/config/ubuntu/$(lsb_release -rs)/packages-microsoft-prod.deb \
    -O packages-microsoft-prod.deb
  dpkg -i packages-microsoft-prod.deb
  rm packages-microsoft-prod.deb
  apt-get update -q
  apt-get install -y dotnet-sdk-8.0
else
  echo "  .NET $(dotnet --version) 확인됨"
fi

# ── 2. 빌드 ─────────────────────────────────────────────────────
echo "▶ 빌드 중..."
cd "$(dirname "$0")/src/Web"
dotnet publish -c Release -o "$APP_DIR" --nologo -q
echo "  빌드 완료 → $APP_DIR"

# ── 3. 필수 디렉토리 및 권한 ─────────────────────────────────────
echo "▶ 디렉토리 설정..."
mkdir -p "$APP_DIR/pki/own/certs"
mkdir -p "$APP_DIR/pki/trusted/certs"
mkdir -p "$APP_DIR/pki/issuers/certs"
mkdir -p "$APP_DIR/pki/rejected/certs"
mkdir -p "$APP_DIR/data/csv"

chown -R "$SERVICE_USER":"$SERVICE_USER" "$APP_DIR"
chmod -R 750 "$APP_DIR"
echo "  권한 설정 완료 (소유자: $SERVICE_USER)"

# ── 4. systemd 서비스 등록 ───────────────────────────────────────
echo "▶ systemd 서비스 등록..."
cat > /etc/systemd/system/${APP_NAME}.service <<EOF
[Unit]
Description=ExperionCrawler OPC UA Web Service
After=network.target

[Service]
Type=simple
User=${SERVICE_USER}
WorkingDirectory=${APP_DIR}
ExecStart=/usr/bin/dotnet ${APP_DIR}/ExperionCrawler.dll
Restart=always
RestartSec=10
KillSignal=SIGINT
SyslogIdentifier=${APP_NAME}
Environment=ASPNETCORE_ENVIRONMENT=Production
Environment=DOTNET_PRINT_TELEMETRY_MESSAGE=false

# 리소스 제한
LimitNOFILE=65536

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable ${APP_NAME}
systemctl restart ${APP_NAME}
echo "  서비스 등록 및 시작 완료"

# ── 5. 방화벽 설정 (ufw 사용 시) ────────────────────────────────
if command -v ufw &> /dev/null; then
  echo "▶ 방화벽 포트 5000 개방..."
  ufw allow 5000/tcp comment 'ExperionCrawler'
fi

# ── 6. 상태 확인 ─────────────────────────────────────────────────
echo ""
echo "▶ 서비스 상태:"
systemctl status ${APP_NAME} --no-pager -l | head -20

echo ""
echo "╔══════════════════════════════════════════════════════════╗"
echo "║  배포 완료!                                              ║"
echo "║  접속 주소: http://$(hostname -I | awk '{print $1}'):5000    ║"
echo "╚══════════════════════════════════════════════════════════╝"
