#!/bin/bash

# ==============================================================================
# Kittisak Project - Integrated Deployment Script (post-receive hook)
# ==============================================================================

# 1. TARGET PATHS (Nginx & PM2)
TARGET_SPA="/home/ti/projects/MyNginxMain/nginx/html/kittisak/spa"
TARGET_ADMIN="/home/ti/projects/MyNginxMain/nginx/html/kittisak/admin"
TARGET_BACKEND="/home/ti/projects/kittisak-api"
TARGET_WEBSITE="/home/ti/projects/kittisak-website"

# 2. REPOSITORY CONFIG
REPO="/home/ti/git/kittisak.com.git"
BRANCH="master"
TEMP_DIR="/tmp/kittisak_build_$(date +%s)"

# 3. BINARY PATHS & PM2
BUN="/home/ti/.bun/bin/bun"
PM2="/home/ti/.nvm/versions/node/v22.17.1/bin/pm2"
PM2_NAME_BACKEND="kittisak-backend"
PM2_NAME_WEBSITE="kittisak-website"
export PATH="$PATH:/home/ti/.bun/bin:/home/ti/.nvm/versions/node/v22.17.1/bin"

# 4. BUILD ENVIRONMENT
export VITE_API_URL="https://api.kittisak.com/api"
export NEXT_PUBLIC_API_URL="https://api.kittisak.com/api"

# Customer-specific values. Fill these in on the server if enabled.
export VITE_LIFF_ID="${VITE_LIFF_ID:-}"
export VITE_OMISE_PUBLIC_KEY="${VITE_OMISE_PUBLIC_KEY:-}"

# Service ports. Nginx proxies to these ports.
BACKEND_PORT=3054
SSR_PORT=3005

# ------------------------------------------------------------------------------
# START DEPLOYMENT
# ------------------------------------------------------------------------------
set -e
echo "------- Starting Full Deployment: Kittisak Platform -------"

# A. Prepare Temp Source from Checkout
echo "Cloning branch $BRANCH to temporary directory: $TEMP_DIR"
mkdir -p $TEMP_DIR
git --work-tree=$TEMP_DIR --git-dir=$REPO checkout -f $BRANCH

cd $TEMP_DIR
echo "Installing monorepo dependencies..."
$BUN install

# B. Build & Deploy SPA
echo ">>> Building SPA..."
cd apps/spa
$BUN run build
echo "Deploying SPA to $TARGET_SPA..."
mkdir -p $TARGET_SPA
rm -rf $TARGET_SPA/*
cp -rv dist/* $TARGET_SPA/
cd ../..

# C. Build & Deploy ADMIN PANEL
echo ">>> Building Admin Panel..."
cd apps/admin
$BUN run build
echo "Deploying Admin Panel to $TARGET_ADMIN..."
mkdir -p $TARGET_ADMIN
rm -rf $TARGET_ADMIN/*
cp -rv dist/* $TARGET_ADMIN/
cd ../..

# D. Deploy & Manage BACKEND (API)
echo ">>> Updating Backend at $TARGET_BACKEND..."
mkdir -p $TARGET_BACKEND
mkdir -p $TARGET_BACKEND/apps
mkdir -p $TARGET_BACKEND/packages

rsync -av --delete \
  --exclude='.env' \
  --exclude='public/' \
  --exclude='node_modules/' \
  apps/backend/ $TARGET_BACKEND/apps/backend/

rsync -av packages/ $TARGET_BACKEND/packages/

cp package.json bun.lock ecosystem.config.js $TARGET_BACKEND/
sed -i 's/homaroma/kittisak/g' $TARGET_BACKEND/ecosystem.config.js
sed -i 's/PORT: 3002/PORT: 3005/g' $TARGET_BACKEND/ecosystem.config.js

cd $TARGET_BACKEND
echo "Installing backend dependencies..."
$BUN install

mkdir -p $TARGET_BACKEND/apps/backend/public

cd $TARGET_BACKEND/apps/backend

echo ">>> Generating Prisma Client..."
$BUN x prisma generate

if [ ! -f "$TARGET_BACKEND/.env" ]; then
    echo "Error: .env file is missing at $TARGET_BACKEND/.env. Deployment aborted."
    exit 1
fi

cp "$TARGET_BACKEND/.env" "$TARGET_BACKEND/apps/backend/.env"
echo ">>> Running Prisma Migrate Deploy..."
$BUN x prisma migrate deploy

# E. PM2 Management - BACKEND
echo ">>> Managing PM2 Process: $PM2_NAME_BACKEND..."
$PM2 startOrReload $TARGET_BACKEND/ecosystem.config.js --only $PM2_NAME_BACKEND --env production --update-env
echo "PM2 process '$PM2_NAME_BACKEND' is running. Waiting 10s for it to fully start..."
sleep 10

# F. Build & Deploy WEBSITE (Next.js SSR)
echo ">>> Building Next.js SSR App inside monorepo temp dir..."
cd $TEMP_DIR/apps/website
$BUN run build

# G. Prepare Next.js SSR
echo ">>> Preparing Next.js SSR App..."
rsync -av --delete \
  $TEMP_DIR/apps/website/.next/standalone/ $TARGET_WEBSITE/
rsync -av \
  $TEMP_DIR/apps/website/public/ $TARGET_WEBSITE/apps/website/public/
rsync -av \
  $TEMP_DIR/apps/website/.next/static/ $TARGET_WEBSITE/apps/website/.next/static/

cp $TEMP_DIR/ecosystem.config.js $TARGET_WEBSITE/
sed -i 's/homaroma/kittisak/g' $TARGET_WEBSITE/ecosystem.config.js
sed -i 's/PORT: 3002/PORT: 3005/g' $TARGET_WEBSITE/ecosystem.config.js

# H. Fix Permissions
echo ">>> Fixing Permissions..."
chown -R ti:ti $TARGET_BACKEND $TARGET_WEBSITE

# I. PM2 Management - SSR Next.js
cd $TARGET_WEBSITE
echo ">>> Creating symlink for .next..."
ln -sf apps/website/.next .next
echo ">>> Managing PM2 Process: $PM2_NAME_WEBSITE..."
$PM2 startOrReload $TARGET_WEBSITE/ecosystem.config.js --only $PM2_NAME_WEBSITE --env production --update-env
echo "PM2 process '$PM2_NAME_WEBSITE' is running."

# J. Cleanup
echo "Cleaning up build artifacts..."
rm -rf $TEMP_DIR

echo "------- ALL DEPLOYMENTS COMPLETED SUCCESSFULLY -------"
echo ""
echo "Service Summary:"
echo "   Website (SSR)  -> https://kittisak.com            (PM2: $PM2_NAME_WEBSITE, Port: $SSR_PORT)"
echo "   SPA            -> https://spa.kittisak.com"
echo "   Admin Panel    -> https://admin.kittisak.com"
echo "   API Backend    -> https://api.kittisak.com        (PM2: $PM2_NAME_BACKEND, Port: $BACKEND_PORT)"
