#!/usr/bin/env bash
# =============================================================
# deploy.sh — Script deployment manual (tanpa Docker)
# System PT. Altrak 1978 Div. Spareparts
#
# Prasyarat di server:
#   - Go 1.24+ terinstall
#   - Node.js 20+ terinstall
#   - Chromium/Google Chrome terinstall (untuk PDF generation)
#   - MySQL 8.0 running
#   - User 'altrak' sudah dibuat: sudo useradd -r -s /sbin/nologin altrak
#   - Folder /opt/altrak-system sudah ada dan dimiliki user altrak
#
# Cara pakai:
#   chmod +x deploy/deploy.sh
#   ./deploy/deploy.sh [--skip-frontend]
# =============================================================

set -euo pipefail

# ── Konfigurasi ──────────────────────────────────────────────
DEPLOY_DIR="/opt/altrak-system"
SERVICE_NAME="altrak-system"
BACKUP_DIR="$DEPLOY_DIR/backups/deploy"
TIMESTAMP=$(date +"%Y%m%d_%H%M%S")
SKIP_FRONTEND="${1:-}"

# Warna output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

log_info()    { echo -e "${BLUE}[INFO]${NC} $1"; }
log_success() { echo -e "${GREEN}[OK]${NC} $1"; }
log_warn()    { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error()   { echo -e "${RED}[ERROR]${NC} $1"; exit 1; }

# ── Validasi Environment ──────────────────────────────────────
log_info "Memvalidasi environment..."

if [ ! -f ".env" ]; then
    log_error "File .env tidak ditemukan. Salin dari .env.example dan isi nilai yang diperlukan."
fi

# Check ENV=production
ENV_VALUE=$(grep -E "^ENV=" .env | cut -d'=' -f2 | tr -d '[:space:]')
if [ "$ENV_VALUE" != "production" ]; then
    log_warn "ENV bukan 'production' di .env (saat ini: '$ENV_VALUE'). Pastikan sudah benar."
fi

# Check DB_PASSWORD tidak kosong
DB_PASS=$(grep -E "^DB_PASSWORD=" .env | cut -d'=' -f2 | tr -d '[:space:]')
if [ -z "$DB_PASS" ]; then
    log_error "DB_PASSWORD kosong di .env. Wajib diisi sebelum deploy ke production."
fi

log_success "Validasi environment selesai."

# ── Backup Binary Lama ────────────────────────────────────────
if [ -f "$DEPLOY_DIR/server" ]; then
    log_info "Membackup binary lama..."
    mkdir -p "$BACKUP_DIR"
    cp "$DEPLOY_DIR/server" "$BACKUP_DIR/server_$TIMESTAMP"
    log_success "Binary lama dibackup ke $BACKUP_DIR/server_$TIMESTAMP"
fi

# ── Build Frontend ────────────────────────────────────────────
if [ "$SKIP_FRONTEND" != "--skip-frontend" ]; then
    log_info "Membangun frontend Next.js..."
    cd web-client
    npm ci --omit=dev
    NODE_ENV=production npm run build
    cd ..
    log_success "Frontend berhasil dibangun → web-client/out/"
else
    log_warn "Skip frontend build (--skip-frontend flag aktif)"
fi

# ── Build Backend ─────────────────────────────────────────────
log_info "Membangun Go binary..."
CGO_ENABLED=1 GOOS=linux go build \
    -ldflags="-s -w -X main.Version=$TIMESTAMP" \
    -o /tmp/altrak-server-new \
    ./cmd/server/main.go
log_success "Go binary berhasil dibangun."

# ── Stop Service ──────────────────────────────────────────────
log_info "Menghentikan service $SERVICE_NAME..."
sudo systemctl stop "$SERVICE_NAME" || log_warn "Service tidak sedang berjalan."

# ── Deploy Files ──────────────────────────────────────────────
log_info "Mendeploy file ke $DEPLOY_DIR..."

# Binary
sudo cp /tmp/altrak-server-new "$DEPLOY_DIR/server"
sudo chown altrak:altrak "$DEPLOY_DIR/server"
sudo chmod 755 "$DEPLOY_DIR/server"

# .env
sudo cp .env "$DEPLOY_DIR/.env"
sudo chown altrak:altrak "$DEPLOY_DIR/.env"
sudo chmod 600 "$DEPLOY_DIR/.env"   # Hanya owner yang bisa baca

# Static frontend
if [ -d "web-client/out" ]; then
    sudo rsync -a --delete web-client/out/ "$DEPLOY_DIR/web-client/out/"
    sudo chown -R altrak:altrak "$DEPLOY_DIR/web-client/"
    log_success "Static frontend berhasil dideploy."
fi

# ── Start Service ─────────────────────────────────────────────
log_info "Memulai service $SERVICE_NAME..."
sudo systemctl start "$SERVICE_NAME"
sleep 3

# Cek status
if systemctl is-active --quiet "$SERVICE_NAME"; then
    log_success "Service $SERVICE_NAME berjalan dengan baik!"
else
    log_error "Service gagal start! Cek log: sudo journalctl -u $SERVICE_NAME -n 50"
fi

# ── Health Check ──────────────────────────────────────────────
log_info "Melakukan health check..."
sleep 2
if curl -sf http://localhost:8080/api/health > /dev/null; then
    log_success "Health check berhasil! Sistem berjalan normal."
else
    log_warn "Health check gagal. Cek log aplikasi."
fi

log_success "==============================================="
log_success "Deploy selesai pada: $(date)"
log_success "==============================================="
