#!/bin/bash
set -e

# eCom01 Build Script

ensure_env_files() {
  if [ ! -f .env ] && [ -f .env.example ]; then
    cp .env.example .env
  fi

  if [ ! -f admin/.env ] && [ -f admin/.env.example ]; then
    cp admin/.env.example admin/.env
  fi

  if [ ! -f frontend/.env.local ] && [ -f frontend/.env.example ]; then
    cp frontend/.env.example frontend/.env.local
  fi
}

case "$1" in
  up)
    ensure_env_files
    docker compose up -d --build
    ;;
  down)
    docker compose down
    ;;
  restart)
    docker compose restart
    ;;
  logs)
    docker compose logs -f
    ;;
  status)
    docker compose ps
    ;;
  install)
    ensure_env_files

    echo "Installing backend dependencies..."
    docker compose run --rm php composer install
    
    echo "Installing frontend dependencies..."
    docker compose run --rm frontend npm install
    
    if grep -q '^APP_KEY=$' admin/.env; then
      echo "Generating Laravel app key..."
      docker compose run --rm php php artisan key:generate
    fi

    docker compose run --rm php php artisan storage:link
    ;;
  migrate)
    echo "Running migrations..."
    docker compose run --rm php php artisan migrate
    ;;
  fresh)
    echo "Running fresh migrations with seeding..."
    docker compose run --rm php php artisan migrate:fresh --seed
    ;;
  frontend-build)
    echo "Building frontend..."
    docker compose run --rm frontend npm run build
    ;;
  admin-optimize)
    echo "Caching Laravel production config, routes, views and events..."
    docker compose run --rm php php artisan optimize
    ;;
  admin-optimize-clear)
    echo "Clearing Laravel cached bootstrap files..."
    docker compose run --rm php php artisan optimize:clear
    ;;
  production-build)
    echo "Running production build checks..."
    docker compose run --rm php composer install --no-dev --prefer-dist --optimize-autoloader
    docker compose run --rm php php artisan migrate --force
    docker compose run --rm php php artisan storage:link
    docker compose run --rm php php artisan optimize
    docker compose run --rm frontend npm ci
    docker compose run --rm frontend npm run build
    ;;
  frontend-lint)
    echo "Linting frontend..."
    docker compose run --rm frontend npm run lint
    ;;
  admin-test)
    echo "Running Laravel tests..."
    docker compose run --rm php php artisan test
    ;;
  health)
    curl -fsS http://admin.localhost/health
    echo
    curl -fsS http://ecom01.localhost/api/health
    echo
    ;;
  *)
    echo "Usage: ./build.sh {up|down|restart|logs|status|install|migrate|fresh|frontend-build|frontend-lint|admin-optimize|admin-optimize-clear|production-build|admin-test|health}"
    exit 1
    ;;
esac
