#!/usr/bin/env bash
#
# Обновление korzilla.ru НА СЕРВЕРЕ. Запускается от владельца сайта (site); обычно его вызывает
# локальный bin/deploy.sh, но можно и вручную:
#   ssh korzilla-prod "sudo -u site -H bash /home/site/web/korzilla.ru/private/korzilla/bin/deploy-server.sh < /dev/null"
#
# Раскладка как у teeu: приложение в private/korzilla, public_html — симлинк на его public/.
# Код приводится к origin/main по deploy key сервера (по сети идут только изменения),
# дальше зависимости, миграции и кэши.
# Не трогает то, что в .gitignore: .env, картинки из админки (public/uploads/images, public/uploads/og),
# public/custom.css, миниатюры (public/thb), логи и кэш в storage/.
# Контент сайта (страницы, блоки, заявки, настройки) живёт в базе — деплой его не меняет.

# Тело целиком в функции, которая вызывается последней строкой: git reset --hard
# может подменить этот файл во время работы, а bash дочитывает скрипт по ходу.
main() {
    set -euo pipefail

    local dir="${DEPLOY_DIR:-/home/site/web/korzilla.ru/private/korzilla}"
    local branch="${DEPLOY_BRANCH:-main}"
    local php="${PHP_BIN:-php8.3}"
    # Свежий Composer пользователя (v-add-user-composer), иначе системный
    local composer="${COMPOSER_BIN:-$HOME/.composer/composer}"
    [ -x "$composer" ] || composer="$(command -v composer)"

    if [ "$(id -u)" -eq 0 ]; then
        echo "ОШИБКА: не запускать от root — файлы станут чужими для PHP. Нужно: sudo -u site -H bash $0" >&2
        exit 1
    fi

    cd "$dir"
    if [ ! -d .git ]; then
        echo "ОШИБКА: $dir не является git-репозиторием." >&2
        exit 1
    fi
    if [ ! -f .env ]; then
        echo "ОШИБКА: нет .env — см. DEPLOY.md, раздел «Первичная настройка»." >&2
        exit 1
    fi

    # Два деплоя одновременно не пускаем
    exec 9>.git/deploy.lock
    if ! flock -n 9; then
        echo "ОШИБКА: деплой уже выполняется." >&2
        exit 1
    fi

    local before
    before="$(git rev-parse HEAD)"
    echo "==> Текущая ревизия: $(git rev-parse --short HEAD)"

    echo "==> Забираем origin/$branch"
    git fetch --prune origin

    # Сбрасываются только отслеживаемые файлы (код); данные из .gitignore остаются.
    # Удалённые из репозитория файлы reset убирает сам.
    echo "==> Приводим рабочую копию к origin/$branch"
    git reset --hard "origin/$branch"

    if [ "$before" = "$(git rev-parse HEAD)" ]; then
        echo "==> Изменений в коде нет."
    else
        echo "==> Выкачены коммиты:"
        git log --oneline "$before..HEAD"
    fi

    # На сервере proc_open отключена в php.ini (disable_functions), а Composer она нужна для своих скриптов
    # (package:discover, filament:upgrade) — снимаем запрет только для этого процесса.
    if [ ! -f vendor/autoload.php ] || ! git diff --quiet "$before" HEAD -- composer.lock composer.json; then
        echo "==> composer install"
        "$php" -d disable_functions= "$composer" install --no-dev --optimize-autoloader --no-interaction --no-progress
    else
        echo "==> Зависимости не менялись — composer install пропущен"
    fi

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

    # Кэш конфигурации/маршрутов/шаблонов и кэш готового HTML страниц
    echo "==> Кэши"
    "$php" artisan optimize:clear > /dev/null
    "$php" artisan cache:clear > /dev/null
    "$php" artisan optimize > /dev/null
    "$php" artisan filament:optimize > /dev/null

    echo "==> Готово: $(git log -1 --pretty='%h %s')"
}

main "$@"
