#!/bin/bash
# ============================================================
#  STRATA GPO — Deploy Script
#  Eliminates manual file copying. Run this after ANY edit.
#  Usage: bash deploy.sh [--force]
# ============================================================

set -e

# --- Configuration ---
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
SOURCE_DIR="$SCRIPT_DIR"
PROD_DIR="$SCRIPT_DIR/strata-prod"
BACKUP_DIR="$PROD_DIR/backups"

# Source files → canonical prod names
declare -A FILE_MAP=(
  ["dashboard-v8.html"]="dashboard.html"
  ["deck-v10.html"]="deck.html"
  ["api.php"]="api.php"
  ["deck-profiles.json"]="deck-profiles.json"
  [".htaccess"]=".htaccess"
  ["reps.json"]="reps.json"
)

# Also copy with versioned names (for backward compat during transition)
declare -A VERSIONED_COPY=(
  ["dashboard-v8.html"]="dashboard-v8.html"
  ["deck-v10.html"]="deck-v10.html"
)

# Colors
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
CYAN='\033[0;36m'
NC='\033[0m'

# --- Pre-flight checks ---
echo ""
echo -e "${CYAN}═══════════════════════════════════════════════${NC}"
echo -e "${CYAN}  STRATA GPO — Deploy to Production${NC}"
echo -e "${CYAN}═══════════════════════════════════════════════${NC}"
echo ""

if [ ! -d "$PROD_DIR" ]; then
  echo -e "${RED}ERROR: strata-prod/ directory not found${NC}"
  exit 1
fi

# --- Generate version stamp ---
VERSION=$(date +%Y%m%d-%H%M%S)
echo -e "${YELLOW}Version:${NC} $VERSION"
echo ""

# --- Create backup ---
mkdir -p "$BACKUP_DIR/$VERSION"
echo -e "${YELLOW}Backing up current prod files...${NC}"
for src_file in "${!FILE_MAP[@]}"; do
  prod_name="${FILE_MAP[$src_file]}"
  if [ -f "$PROD_DIR/$prod_name" ]; then
    cp "$PROD_DIR/$prod_name" "$BACKUP_DIR/$VERSION/$prod_name"
    echo -e "  ${GREEN}✓${NC} Backed up $prod_name"
  fi
done
echo ""

# --- Compare and deploy ---
CHANGES=0
echo -e "${YELLOW}Checking for changes...${NC}"
for src_file in "${!FILE_MAP[@]}"; do
  prod_name="${FILE_MAP[$src_file]}"
  src_path="$SOURCE_DIR/$src_file"
  prod_path="$PROD_DIR/$prod_name"

  if [ ! -f "$src_path" ]; then
    echo -e "  ${RED}✗${NC} Source missing: $src_file — skipped"
    continue
  fi

  # Check if files differ
  if [ -f "$prod_path" ] && cmp -s "$src_path" "$prod_path"; then
    echo -e "  ${GREEN}═${NC} $src_file → $prod_name (no changes)"
  else
    cp "$src_path" "$prod_path"
    CHANGES=$((CHANGES + 1))

    # File size for reference
    SIZE=$(wc -c < "$src_path" | tr -d ' ')
    SIZE_KB=$((SIZE / 1024))
    echo -e "  ${GREEN}✓${NC} $src_file → $prod_name (${SIZE_KB}KB deployed)"
  fi

  # Also copy versioned name if applicable
  versioned_name="${VERSIONED_COPY[$src_file]:-}"
  if [ -n "$versioned_name" ] && [ "$versioned_name" != "$prod_name" ]; then
    cp "$src_path" "$PROD_DIR/$versioned_name"
    echo -e "  ${GREEN}✓${NC}   └─ also → $versioned_name (backward compat)"
  fi
done
echo ""

# --- Write version manifest ---
cat > "$PROD_DIR/version.json" << EOF
{
  "version": "$VERSION",
  "deployed": "$(date -u +%Y-%m-%dT%H:%M:%SZ)",
  "files": {
$(for src_file in "${!FILE_MAP[@]}"; do
    prod_name="${FILE_MAP[$src_file]}"
    if [ -f "$SOURCE_DIR/$src_file" ]; then
      hash=$(md5sum "$SOURCE_DIR/$src_file" | cut -d' ' -f1)
      size=$(wc -c < "$SOURCE_DIR/$src_file" | tr -d ' ')
      echo "    \"$prod_name\": {\"md5\": \"$hash\", \"bytes\": $size, \"source\": \"$src_file\"},"
    fi
done)
    "_generated": true
  }
}
EOF
echo -e "${GREEN}✓${NC} Version manifest written: version.json"

# --- Summary ---
echo ""
echo -e "${CYAN}═══════════════════════════════════════════════${NC}"
if [ $CHANGES -gt 0 ]; then
  echo -e "${GREEN}  DEPLOYED: $CHANGES file(s) updated${NC}"
  echo -e "${GREEN}  Version:  $VERSION${NC}"
  echo -e "${GREEN}  Backup:   backups/$VERSION/${NC}"
else
  echo -e "${YELLOW}  NO CHANGES — all files already in sync${NC}"
  # Clean up empty backup dir
  rmdir "$BACKUP_DIR/$VERSION" 2>/dev/null || true
fi
echo -e "${CYAN}═══════════════════════════════════════════════${NC}"
echo ""

# --- Cleanup old backups (keep last 10) ---
BACKUP_COUNT=$(ls -d "$BACKUP_DIR"/*/ 2>/dev/null | wc -l)
if [ "$BACKUP_COUNT" -gt 10 ]; then
  REMOVE_COUNT=$((BACKUP_COUNT - 10))
  echo -e "${YELLOW}Cleaning up old backups (keeping last 10)...${NC}"
  ls -d "$BACKUP_DIR"/*/ | head -n "$REMOVE_COUNT" | while read dir; do
    rm -rf "$dir"
    echo -e "  Removed $(basename "$dir")"
  done
  echo ""
fi
