#!/usr/bin/env bash
#
# Maven Group CMS — Laravel backend installer
#
# What this does, in order:
#   1. Creates a fresh Laravel 11 project
#   2. Copies in the provided CMS code (models, migrations, controllers, routes, seeders)
#   3. Installs the required Composer packages (Sanctum, Spatie Permission, Media Library, etc.)
#   4. Writes your real database credentials into .env
#   5. Runs migrations + seeders
#   6. Optionally imports your legacy blog posts / service page content
#
# USAGE:
#   1. Put this script and the "backend-source" folder in the same directory.
#   2. Edit the variables below (DB_* and FRONTEND_URL/ADMIN_URL) — or just run it
#      and answer the prompts.
#   3. chmod +x setup-backend.sh && ./setup-backend.sh
#
# REQUIREMENTS on the machine you run this on: PHP 8.2+, Composer, MySQL access.
# (This will NOT work in a sandbox with no internet/Packagist access — run it
#  on your local machine or your cPanel server via SSH.)

set -e

PROJECT_NAME="maven-backend"
SOURCE_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/backend-source"

echo "=================================================="
echo " Maven Group CMS — Laravel Backend Setup"
echo "=================================================="

if [ ! -d "$SOURCE_DIR" ]; then
  echo "ERROR: Could not find backend-source folder next to this script."
  exit 1
fi

command -v composer >/dev/null 2>&1 || { echo "ERROR: composer is not installed or not on PATH."; exit 1; }
command -v php >/dev/null 2>&1 || { echo "ERROR: php is not installed or not on PATH."; exit 1; }

# ---- Gather DB credentials (skips prompt if env vars already set) ----
read -p "Database host [127.0.0.1]: " INPUT_DB_HOST
DB_HOST=${INPUT_DB_HOST:-127.0.0.1}

read -p "Database port [3306]: " INPUT_DB_PORT
DB_PORT=${INPUT_DB_PORT:-3306}

read -p "Database name: " DB_DATABASE
while [ -z "$DB_DATABASE" ]; do
  read -p "Database name (required): " DB_DATABASE
done

read -p "Database username: " DB_USERNAME
while [ -z "$DB_USERNAME" ]; do
  read -p "Database username (required): " DB_USERNAME
done

read -sp "Database password (hidden): " DB_PASSWORD
echo ""

read -p "Your Next.js frontend URL [http://localhost:3000]: " INPUT_FRONTEND_URL
FRONTEND_URL=${INPUT_FRONTEND_URL:-http://localhost:3000}

read -p "Your admin dashboard URL [http://localhost:5173]: " INPUT_ADMIN_URL
ADMIN_URL=${INPUT_ADMIN_URL:-http://localhost:5173}

read -p "App URL for this API (e.g. https://api.yourdomain.com) [http://localhost:8000]: " INPUT_APP_URL
APP_URL=${INPUT_APP_URL:-http://localhost:8000}

# ---- Step 1: Fresh Laravel project ----
if [ -d "$PROJECT_NAME" ]; then
  echo ""
  echo "Folder '$PROJECT_NAME' already exists."
  read -p "Delete it and start fresh? [y/N]: " CONFIRM
  if [[ "$CONFIRM" =~ ^[Yy]$ ]]; then
    rm -rf "$PROJECT_NAME"
  else
    echo "Aborting so nothing gets overwritten. Remove or rename '$PROJECT_NAME' and re-run."
    exit 1
  fi
fi

echo ""
echo ">> Creating fresh Laravel 11 project..."
composer create-project laravel/laravel:^11.0 "$PROJECT_NAME"
cd "$PROJECT_NAME"

# ---- Step 2: Merge in provided CMS code ----
echo ""
echo ">> Copying in CMS application code..."
cp -r "$SOURCE_DIR/app/Models/." app/Models/
cp -r "$SOURCE_DIR/app/Http/Controllers/." app/Http/Controllers/
cp -r "$SOURCE_DIR/app/Http/Middleware/." app/Http/Middleware/ 2>/dev/null || true
cp -r "$SOURCE_DIR/app/Policies/." app/Policies/
cp "$SOURCE_DIR/app/Providers/AppServiceProvider.php" app/Providers/AppServiceProvider.php
cp -r "$SOURCE_DIR/app/Mail/." app/Mail/ 2>/dev/null || true
cp -r "$SOURCE_DIR/app/Console/Commands/." app/Console/Commands/ 2>/dev/null || true
cp -r "$SOURCE_DIR/database/migrations/." database/migrations/
cp -r "$SOURCE_DIR/database/seeders/." database/seeders/
cp "$SOURCE_DIR/database/legacy-blog-posts.json" database/ 2>/dev/null || true
cp "$SOURCE_DIR/database/legacy-service-pages.json" database/ 2>/dev/null || true
cp "$SOURCE_DIR/routes/api.php" routes/api.php
cp "$SOURCE_DIR/routes/web.php" routes/web.php
cp "$SOURCE_DIR/config/cors.php" config/cors.php
cp -r "$SOURCE_DIR/resources/views/." resources/views/ 2>/dev/null || true

# ---- Step 3: Install required packages ----
echo ""
echo ">> Installing Composer packages (this can take a few minutes)..."
composer require laravel/sanctum spatie/laravel-permission spatie/laravel-sluggable spatie/laravel-medialibrary intervention/image --no-interaction

echo ""
echo ">> Publishing Spatie Permission config..."
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --force

# Our migrations already include the permission tables migration — remove any
# duplicate the publish command may have just generated, keep the provided one.
find database/migrations -name "*_create_permission_tables.php" ! -newer "$SOURCE_DIR/database/migrations/0001_01_01_000003_create_permission_tables.php" -delete 2>/dev/null || true

echo ""
echo ">> Publishing Media Library migration/config..."
php artisan vendor:publish --provider="Spatie\MediaLibrary\MediaLibraryServiceProvider" --force || true

# ---- Register providers ----
if ! grep -q "PermissionServiceProvider" bootstrap/providers.php 2>/dev/null; then
  true # Spatie auto-discovers, no manual step needed in Laravel 11
fi

# ---- Step 4: Configure .env ----
echo ""
echo ">> Writing .env..."
php artisan key:generate --force

# Update or append each key
set_env() {
  local key="$1" val="$2"
  if grep -q "^${key}=" .env; then
    # escape sed special chars in val
    local esc_val
    esc_val=$(printf '%s\n' "$val" | sed -e 's/[\/&]/\\&/g')
    sed -i "s/^${key}=.*/${key}=${esc_val}/" .env
  else
    echo "${key}=${val}" >> .env
  fi
}

set_env "APP_NAME" "\"Maven Group CMS\""
set_env "APP_URL" "$APP_URL"
set_env "DB_CONNECTION" "mysql"
set_env "DB_HOST" "$DB_HOST"
set_env "DB_PORT" "$DB_PORT"
set_env "DB_DATABASE" "$DB_DATABASE"
set_env "DB_USERNAME" "$DB_USERNAME"
set_env "DB_PASSWORD" "$DB_PASSWORD"
set_env "FRONTEND_URL" "$FRONTEND_URL"
set_env "ADMIN_URL" "$ADMIN_URL"

FRONTEND_HOST=$(echo "$FRONTEND_URL" | sed -E 's~https?://~~')
ADMIN_HOST=$(echo "$ADMIN_URL" | sed -E 's~https?://~~')
set_env "SANCTUM_STATEFUL_DOMAINS" "${FRONTEND_HOST},${ADMIN_HOST}"
set_env "SESSION_DOMAIN" "null"
set_env "FILESYSTEM_DISK" "public"

# ---- Step 5: Test DB connection, then migrate + seed ----
echo ""
echo ">> Testing database connection..."
php artisan migrate:status >/dev/null 2>&1 || {
  echo "Could not connect using the credentials given. Double-check DB_HOST/DB_DATABASE/DB_USERNAME/DB_PASSWORD in .env and re-run:"
  echo "    php artisan migrate --seed"
  exit 1
}

echo ""
echo ">> Running migrations + seeders..."
php artisan storage:link || true
php artisan migrate --seed --force

echo ""
echo "=================================================="
echo " Done! Backend is set up in ./$PROJECT_NAME"
echo "=================================================="
echo ""
echo "Default super-admin login (CHANGE THIS PASSWORD IMMEDIATELY):"
echo "  email:    admin@mavengroup.com"
echo "  password: ChangeMe!12345"
echo ""
echo "Optional next steps:"
echo "  cd $PROJECT_NAME"
echo "  php artisan blog:import-legacy        # import your 268 existing blog posts"
echo "  php artisan content:import-real        # import real site settings + service pages"
echo "  php artisan serve                      # run locally at http://localhost:8000"
echo ""
echo "For production (cPanel) deployment, see CPANEL_DEPLOYMENT.md."
