#!/usr/bin/env bash
# =============================================================================
#  Agency PM — cPanel Quick Deploy Script
#  Builds the React frontend, uploads both backend and frontend via SCP,
#  then runs post-deploy commands on the server over SSH.
#
#  Prerequisites on your LOCAL machine:
#    - ssh / scp (standard on macOS/Linux, use Git Bash on Windows)
#    - node + npm (to build React)
#    - rsync (optional but faster than scp for large uploads)
#
#  Usage:
#    bash scripts/deploy-cpanel.sh              ← full deploy
#    bash scripts/deploy-cpanel.sh --frontend   ← frontend only
#    bash scripts/deploy-cpanel.sh --backend    ← backend only
# =============================================================================
set -e

RED='\033[0;31m'; GREEN='\033[0;32m'; YELLOW='\033[1;33m'
CYAN='\033[0;36m'; BOLD='\033[1m'; NC='\033[0m'
info()    { echo -e "${CYAN}[INFO]${NC}  $*"; }
success() { echo -e "${GREEN}[OK]${NC}    $*"; }
warn()    { echo -e "${YELLOW}[WARN]${NC}  $*"; }
section() { echo -e "\n${BOLD}${CYAN}══ $* ══${NC}"; }

echo -e "${BOLD}${CYAN}"
echo "  ┌─────────────────────────────────────────┐"
echo "  │   Agency PM — cPanel Quick Deploy       │"
echo "  └─────────────────────────────────────────┘"
echo -e "${NC}"

# ── Config — edit these values ─────────────────────────────────────────────
# Copy this block to a local file called deploy.conf and source it:
#   source deploy.conf && bash scripts/deploy-cpanel.sh
if [ -f "$(dirname "$0")/deploy.conf" ]; then
  # shellcheck disable=SC1091
  source "$(dirname "$0")/deploy.conf"
  info "Loaded deploy.conf"
fi

SSH_USER="${SSH_USER:-cpanel_user}"
SSH_HOST="${SSH_HOST:-yourdomain.com}"
SSH_PORT="${SSH_PORT:-22}"
SSH_KEY="${SSH_KEY:-~/.ssh/id_rsa}"

# Remote paths (adjust to match your cPanel home structure)
REMOTE_BACKEND="${REMOTE_BACKEND:-/home/${SSH_USER}/api.yourdomain.com}"
REMOTE_FRONTEND="${REMOTE_FRONTEND:-/home/${SSH_USER}/public_html}"

# Local paths
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
ROOT_DIR="$(dirname "$SCRIPT_DIR")"
BACKEND="${ROOT_DIR}/backend"
FRONTEND="${ROOT_DIR}/frontend"

# Parse flags
DEPLOY_BACKEND=true
DEPLOY_FRONTEND=true
for arg in "$@"; do
  case $arg in
    --frontend) DEPLOY_BACKEND=false ;;
    --backend)  DEPLOY_FRONTEND=false ;;
  esac
done

SSH_OPTS="-i ${SSH_KEY} -p ${SSH_PORT} -o StrictHostKeyChecking=no"
SCP_OPTS="-i ${SSH_KEY} -P ${SSH_PORT} -o StrictHostKeyChecking=no"

# ── Confirm ────────────────────────────────────────────────────────────────
info "Target  : ${SSH_USER}@${SSH_HOST}:${SSH_PORT}"
info "Backend : ${REMOTE_BACKEND}"
info "Frontend: ${REMOTE_FRONTEND}"
echo ""
read -rp "  Deploy now? [y/N] " CONFIRM
[[ "$CONFIRM" =~ ^[Yy]$ ]] || { echo "Aborted."; exit 0; }

# ── Build React ────────────────────────────────────────────────────────────
if $DEPLOY_FRONTEND; then
  section "Building React"
  cd "${FRONTEND}"

  if [ ! -f .env.production ]; then
    warn ".env.production not found — creating with placeholder"
    echo "VITE_API_URL=https://api.${SSH_HOST}/api/v1" > .env.production
    warn "Edit frontend/.env.production if your API URL differs, then re-run."
  fi

  npm ci --silent
  npm run build
  success "Build complete → frontend/dist/"
fi

# ── Upload Backend ─────────────────────────────────────────────────────────
if $DEPLOY_BACKEND; then
  section "Uploading Backend"
  info "This may take a minute..."

  # Exclude dev files
  if command -v rsync &>/dev/null; then
    rsync -az --delete \
      --exclude='.git' \
      --exclude='node_modules' \
      --exclude='.env' \
      --exclude='storage/logs/*' \
      --exclude='storage/framework/cache/*' \
      -e "ssh ${SSH_OPTS}" \
      "${BACKEND}/" "${SSH_USER}@${SSH_HOST}:${REMOTE_BACKEND}/"
  else
    # Fallback: tar + scp
    info "rsync not found, using tar+scp..."
    TMPTAR="/tmp/agencypm-backend-$(date +%s).tar.gz"
    tar -czf "${TMPTAR}" \
      --exclude='.git' \
      --exclude='vendor' \
      --exclude='.env' \
      --exclude='storage/logs' \
      -C "${ROOT_DIR}" backend
    scp ${SCP_OPTS} "${TMPTAR}" "${SSH_USER}@${SSH_HOST}:/tmp/agencypm-backend.tar.gz"
    rm "${TMPTAR}"
    ssh ${SSH_OPTS} "${SSH_USER}@${SSH_HOST}" "
      mkdir -p '${REMOTE_BACKEND}'
      tar -xzf /tmp/agencypm-backend.tar.gz -C '${REMOTE_BACKEND}' --strip-components=1
      rm /tmp/agencypm-backend.tar.gz
    "
  fi
  success "Backend uploaded"
fi

# ── Upload Frontend ─────────────────────────────────────────────────────────
if $DEPLOY_FRONTEND; then
  section "Uploading Frontend"
  info "Uploading dist/ ..."

  if command -v rsync &>/dev/null; then
    rsync -az --delete \
      -e "ssh ${SSH_OPTS}" \
      "${FRONTEND}/dist/" "${SSH_USER}@${SSH_HOST}:${REMOTE_FRONTEND}/"
  else
    TMPTAR="/tmp/agencypm-frontend-$(date +%s).tar.gz"
    tar -czf "${TMPTAR}" -C "${FRONTEND}/dist" .
    scp ${SCP_OPTS} "${TMPTAR}" "${SSH_USER}@${SSH_HOST}:/tmp/agencypm-frontend.tar.gz"
    rm "${TMPTAR}"
    ssh ${SSH_OPTS} "${SSH_USER}@${SSH_HOST}" "
      mkdir -p '${REMOTE_FRONTEND}'
      tar -xzf /tmp/agencypm-frontend.tar.gz -C '${REMOTE_FRONTEND}'
      rm /tmp/agencypm-frontend.tar.gz
    "
  fi
  success "Frontend uploaded"
fi

# ── Post-deploy commands ───────────────────────────────────────────────────
section "Post-deploy"
info "Running remote commands..."

ssh ${SSH_OPTS} "${SSH_USER}@${SSH_HOST}" bash <<REMOTE
set -e

cd "${REMOTE_BACKEND}"

# Install/update PHP deps (Composer must be in PATH on cPanel)
if command -v composer &>/dev/null; then
  composer install --no-dev --optimize-autoloader --quiet
elif [ -f ~/composer.phar ]; then
  php ~/composer.phar install --no-dev --optimize-autoloader --quiet
fi

# Ensure .env exists
if [ ! -f .env ]; then
  cp .env.example .env
  echo "[WARN] .env was missing — please configure it via cPanel File Manager"
fi

# Clear + rebuild caches
php artisan config:cache
php artisan route:cache
php artisan view:cache

# Run any pending migrations
php artisan migrate --force

# Fix permissions
find storage bootstrap/cache -type d -exec chmod 775 {} \;
find storage bootstrap/cache -type f -exec chmod 664 {} \;

echo "[OK] Post-deploy done"
REMOTE

success "Remote commands complete"

# ── Done ───────────────────────────────────────────────────────────────────
echo ""
echo -e "${GREEN}${BOLD}  ✓ Deploy finished!${NC}"
echo ""
echo -e "  🌐 App → https://${SSH_HOST}"
echo -e "  🔌 API → https://api.${SSH_HOST}/api/v1"
echo ""
warn "Remember to clear your browser cache on first load after a deploy."
echo ""
