#!/usr/bin/env bash

set -euo pipefail

ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
cd "$ROOT_DIR"

PHP_BIN="${PHP_BIN:-php}"
COMPOSER_BIN="${COMPOSER_BIN:-composer}"

if [[ ! -f .env ]]; then
    echo "Missing .env file. Copy .env.production.example to .env and fill the production values first." >&2
    exit 1
fi

if command -v yarn >/dev/null 2>&1; then
    FRONT_INSTALL_CMD=(yarn install --non-interactive)
    FRONT_BUILD_CMD=(yarn build)
elif command -v npm >/dev/null 2>&1; then
    FRONT_INSTALL_CMD=(npm ci --ignore-scripts)
    FRONT_BUILD_CMD=(npm run build)
else
    echo "Neither yarn nor npm is available on this server." >&2
    exit 1
fi

echo "Installing PHP dependencies..."
"$COMPOSER_BIN" install --no-dev --prefer-dist --optimize-autoloader --no-interaction

if ! grep -Eq '^APP_KEY=base64:' .env; then
    echo "Generating application key..."
    "$PHP_BIN" artisan key:generate --force --no-interaction
fi

echo "Preparing Laravel caches..."
"$PHP_BIN" artisan optimize:clear

if [[ ! -L public/storage ]]; then
    echo "Creating storage symlink..."
    "$PHP_BIN" artisan storage:link
fi

echo "Running database migrations..."
"$PHP_BIN" artisan migrate --force --no-interaction

echo "Installing frontend dependencies..."
"${FRONT_INSTALL_CMD[@]}"

echo "Building frontend assets..."
"${FRONT_BUILD_CMD[@]}"

echo "Caching framework metadata..."
"$PHP_BIN" artisan optimize

echo "Deployment completed successfully."
