#!/usr/bin/env bash
#
# Обновление стенда/боевого сервера (ТЗ §27).
#
# Запускается на сервере от пользователя домена:
#   cd /home/restomesto/web/restomesto.com/private/restomesto && ./deploy.sh
#
# Порядок шагов не произволен:
#   - режим обслуживания охватывает всё, что может застать приложение в
#     промежуточном состоянии между кодом и схемой базы;
#   - миграции идут до прогрева кешей, иначе кеш конфигурации переживёт
#     изменение схемы;
#   - очередь перезапускается последней: воркеры должны подхватить новый код,
#     а не догрузить старый в середине обновления.
#
# Node на сервере нет: собранные ассеты приезжают из CI и распаковываются в
# public/build до запуска этого скрипта.

set -euo pipefail

APP_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PHP="${PHP_BIN:-/usr/bin/php8.3} -d disable_functions="
BRANCH="${DEPLOY_BRANCH:-main}"

cd "$APP_DIR"

echo "==> Ветка $BRANCH"
git fetch --prune origin
git reset --hard "origin/$BRANCH"

# Здесь же composer запускает `filament:upgrade` (post-autoload-dump): панель
# раздаёт свой JavaScript из public/js/filament, а туда его копирует только эта
# команда. Без неё страницы отдаются со ссылками на 404 — см. deployment.md.
echo "==> Зависимости"
$PHP "$(command -v composer)" install --no-dev --optimize-autoloader --no-interaction --no-progress

# Режим обслуживания с retry: поисковики получат 503 с Retry-After, а не 500.
echo "==> Режим обслуживания"
$PHP artisan down --retry=60 || true

cleanup() {
    $PHP artisan up || true
}
trap cleanup EXIT

echo "==> Миграции"
$PHP artisan migrate --force

echo "==> Кеши"
$PHP artisan config:cache
$PHP artisan route:cache
$PHP artisan view:cache
$PHP artisan filament:optimize

# --force: без него команда кричит ERROR на уже существующей ссылке, и лог
# обычного обновления выглядит как лог аварии.
echo "==> Ссылка на хранилище"
$PHP artisan storage:link --force

echo "==> Очередь"
$PHP artisan queue:restart

trap - EXIT
$PHP artisan up

echo "==> Готово: $(git rev-parse --short HEAD)"
