#!/usr/bin/env bash
# ==============================================================================
# DSCons Enterprise ERP - Google Compute Engine (GCE) Bootstrap Automation
# Chạy trên Ubuntu 22.04 / 24.04 LTS x86_64
# ==============================================================================

set -eo pipefail

echo -e "\033[1;36m"
echo "================================================================"
echo "    KHỞI TẠO & TRIỂN KHAI TỰ ĐỘNG DSCONS ERP TRÊN GOOGLE CLOUD   "
echo "        Công ty TNHH Xây Dựng Định Sơn (MST: 0202111150)        "
echo "================================================================"
echo -e "\033[0m"

# 1. Kiểm tra quyền root
if [ "$EUID" -ne 0 ]; then
  echo -e "\033[1;31m[LỖI] Vui lòng chạy script với quyền root: sudo bash deploy_gce.sh\033[0m"
  exit 1
fi

export DEBIAN_FRONTEND=noninteractive

# 2. Cập nhật hệ điều hành và cài đặt các tiện ích cơ bản
echo -e "\033[1;33m[1/6] Đang cập nhật hệ thống và cài đặt gói bổ trợ...\033[0m"
apt-get update -y
apt-get install -y --no-install-recommends \
    ca-certificates \
    curl \
    gnupg \
    lsb-release \
    git \
    ufw \
    fail2ban \
    htop \
    jq

# 3. Cài đặt Docker Engine & Docker Compose Plugin (Official Docker Repo)
if ! command -v docker &> /dev/null; then
    echo -e "\033[1;33m[2/6] Đang cài đặt Docker Engine chính hãng...\033[0m"
    install -m 0755 -d /etc/apt/keyrings
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
    chmod a+r /etc/apt/keyrings/docker.asc

    echo \
      "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
      $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
      tee /etc/apt/sources.list.d/docker.list > /dev/null

    apt-get update -y
    apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
    systemctl enable --now docker
    echo -e "\033[1;32m[OK] Docker Engine và Docker Compose đã được cài đặt thành công.\033[0m"
else
    echo -e "\033[1;32m[OK] Docker Engine đã tồn tại trên hệ thống.\033[0m"
fi

# 4. Tối ưu tham số nhân Linux cho Qdrant Vector DB & Memory
echo -e "\033[1;33m[3/6] Tối ưu hóa tham số Kernel Linux...\033[0m"
sysctl -w vm.max_map_count=262144 > /dev/null
if ! grep -q "vm.max_map_count=262144" /etc/sysctl.conf; then
    echo "vm.max_map_count=262144" >> /etc/sysctl.conf
fi

# 5. Thiết lập mã nguồn dự án tại /opt/dscons
APP_DIR="/opt/dscons"
echo -e "\033[1;33m[4/6] Thiết lập mã nguồn DSCons tại ${APP_DIR}...\033[0m"

if [ ! -d "${APP_DIR}/.git" ]; then
    mkdir -p "${APP_DIR}"
    echo "[INFO] Đang kéo mã nguồn từ GitHub..."
    if ! git clone -b refactor/modular-monolith-projects https://github.com/mirsixabcf2-commits/DSCons.git "${APP_DIR}" 2>/dev/null; then
        echo -e "\033[1;33m[LƯU Ý] Repository yêu cầu quyền truy cập. Vui lòng nhập GitHub Personal Access Token (PAT) hoặc dán link có token:\033[0m"
        read -r -p "GitHub Token (hoặc bỏ trống để thoát): " GH_TOKEN
        if [ -n "$GH_TOKEN" ]; then
            git clone -b refactor/modular-monolith-projects "https://${GH_TOKEN}@github.com/mirsixabcf2-commits/DSCons.git" "${APP_DIR}"
        else
            echo -e "\033[1;31m[LỖI] Không thể kéo mã nguồn khi chưa xác thực GitHub.\033[0m"
            exit 1
        fi
    fi
else
    echo "[INFO] Đang cập nhật mã nguồn mới nhất từ GitHub..."
    cd "${APP_DIR}"
    git pull origin $(git rev-parse --abbrev-ref HEAD) || true
fi

cd "${APP_DIR}"

# 6. Thiết lập file .env bảo mật nếu chưa tồn tại
if [ ! -f .env ]; then
    echo "[INFO] Tạo file .env từ mẫu .env.example..."
    cp .env.example .env
    
    # Sinh ngẫu nhiên JWT Secret Key 64 ký tự hex an toàn
    RANDOM_JWT=$(openssl rand -hex 32)
    sed -i "s/your_production_jwt_secret_key_minimum_32_characters_here/${RANDOM_JWT}/g" .env
    
    # Sinh mật khẩu PostgreSQL ngẫu nhiên an toàn
    RANDOM_DB_PASS=$(openssl rand -hex 16)
    sed -i "s/POSTGRES_PASSWORD=dscons_password/POSTGRES_PASSWORD=${RANDOM_DB_PASS}/g" .env
    sed -i "s/:dscons_password@/:${RANDOM_DB_PASS}@/g" .env
    
    # Đặt môi trường production
    sed -i "s/APP_ENV=development/APP_ENV=production/g" .env
    sed -i "s/127.0.0.1/postgres/g" .env || true
    echo -e "\033[1;32m[OK] Đã sinh tự động JWT Secret và mật khẩu CSDL an toàn.\033[0m"
fi

# Tạo sẵn các thư mục dữ liệu cần thiết
mkdir -p storage deployment/qdrant-data logs deployment/certbot/conf deployment/certbot/www

# 7. Cấu hình Firewall UFW (Chỉ mở 22, 80, 443)
echo -e "\033[1;33m[5/6] Kích hoạt tường lửa bảo mật UFW...\033[0m"
ufw allow 22/tcp comment "SSH" || true
ufw allow 80/tcp comment "HTTP" || true
ufw allow 443/tcp comment "HTTPS" || true
ufw --force enable || true

# 8. Khởi chạy toàn bộ hệ thống bằng Docker Compose
echo -e "\033[1;33m[6/6] Đang biên dịch Docker image và khởi chạy toàn bộ dịch vụ...\033[0m"
docker compose -f docker-compose.prod.yml down --remove-orphans || true
docker compose -f docker-compose.prod.yml up -d --build

# 9. Kiểm tra Healthcheck
echo "[INFO] Đang chờ hệ thống khởi động..."
HEALTHY=false
for i in {1..30}; do
    STATUS_CODE=$(curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1/health || true)
    if [ "$STATUS_CODE" -eq 200 ]; then
        HEALTHY=true
        break
    fi
    sleep 2
done

# Lấy địa chỉ IP ngoại mạng của máy ảo GCE
EXTERNAL_IP=$(curl -s -H "Metadata-Flavor: Google" http://metadata.google.internal/computeMetadata/v1/instance/network-interfaces/0/access-configs/0/external-ip 2>/dev/null || curl -s ifconfig.me || echo "YOUR_GCE_IP")

echo ""
echo -e "\033[1;32m================================================================"
if [ "$HEALTHY" = true ]; then
    echo "       🎉 DSCONS ERP ĐÃ TRIỂN KHAI THÀNH CÔNG TRÊN GCE!         "
else
    echo "       ⚠️ CÁC DỊCH VỤ ĐÃ KHỞI CHẠY (ĐANG HOÀN TẤT WARMUP)       "
fi
echo "================================================================"
echo -e "\033[0m"
echo -e "👉 Địa chỉ truy cập Web ERP: \033[1;34mhttp://${EXTERNAL_IP}\033[0m"
echo -e "👉 Tài liệu API Swagger:     \033[1;34mhttp://${EXTERNAL_IP}/docs\033[0m"
echo ""
echo "Các lệnh quản trị nhanh:"
echo " - Xem log ứng dụng:       cd /opt/dscons && docker compose -f docker-compose.prod.yml logs -f backend"
echo " - Khởi động lại dịch vụ:  cd /opt/dscons && docker compose -f docker-compose.prod.yml restart"
echo " - Trạng thái container:   docker ps"
echo "================================================================"
