#!/usr/bin/env bash
# liderra-precheck.sh — pre-flight гейт перед/после деплоя.
# Проверяет .env, ключи, БД, Redis, шифрование. exit 1 при любом провале.
# Запускать руками после scp файлов / git pull, до systemctl restart.
set -e

APP_DIR="/var/www/liderra/app"
ENV="$APP_DIR/.env"
FAIL=0

red()   { printf '\033[31m✗ %s\033[0m\n' "$1"; FAIL=1; }
green() { printf '\033[32m✓ %s\033[0m\n' "$1"; }
yellow(){ printf '\033[33m! %s\033[0m\n' "$1"; }

echo "=== liderra pre-flight check ==="

# 1. .env existence + perms
if [[ ! -f "$ENV" ]]; then red "$ENV отсутствует"; exit 1; fi
if [[ "$(stat -c '%U' "$ENV")" != "www-data" ]]; then yellow ".env owner $(stat -c '%U:%G %a' "$ENV") — должен быть www-data:www-data 640"; fi
green ".env существует"

# 2. CRLF check
CRLF=$(grep -c $'\r' "$ENV" || true)
if [[ "$CRLF" -gt 0 ]]; then red ".env содержит $CRLF строк с CRLF — Laravel сломает значения. Запусти: sudo sed -i 's/\\r\$//' $ENV"; else green ".env без CRLF"; fi

# 3. APP_KEY
KEY=$(grep '^APP_KEY=' "$ENV" | head -1 | cut -d= -f2-)
if [[ -z "$KEY" ]]; then red "APP_KEY пустой";
elif [[ "$KEY" != base64:* ]]; then red "APP_KEY без префикса base64: → '$KEY'";
elif [[ "${#KEY}" -ne 51 ]]; then red "APP_KEY длина ${#KEY}, должна быть 51 (base64: + 44 символа base64)";
else green "APP_KEY корректный (${#KEY} символов)"; fi

# 4. Дубль APP_KEY
DUP=$(grep -c '^APP_KEY=' "$ENV" || true)
if [[ "$DUP" -gt 1 ]]; then red "В .env $DUP строк APP_KEY= — должна быть одна"; fi

# 5. Critical drivers
for VAR in APP_ENV DB_CONNECTION SESSION_DRIVER CACHE_STORE QUEUE_CONNECTION REDIS_HOST; do
    V=$(grep "^${VAR}=" "$ENV" | head -1 | cut -d= -f2-)
    if [[ -z "$V" ]]; then yellow "$VAR не задан (берётся дефолт)"; else green "$VAR=$V"; fi
done

# 6. PostgreSQL connection
cd "$APP_DIR"
if sudo -u www-data php -r "require 'vendor/autoload.php'; \$app=require 'bootstrap/app.php'; \$app->make(Illuminate\Contracts\Console\Kernel::class)->bootstrap(); try { DB::select('SELECT 1'); echo 'PG_OK'; } catch (Throwable \$e) { echo 'PG_FAIL: '.\$e->getMessage(); }" 2>/dev/null | grep -q "PG_OK"; then
    green "PostgreSQL доступен"
else
    red "PostgreSQL недоступен — проверь DB_HOST/DB_PASSWORD"
fi

# 7. Redis ping
if sudo -u www-data php -r "require 'vendor/autoload.php'; \$app=require 'bootstrap/app.php'; \$app->make(Illuminate\Contracts\Console\Kernel::class)->bootstrap(); try { \$r=Illuminate\Support\Facades\Redis::ping(); echo strpos(strtolower((string)\$r ?: 'pong'),'pong')!==false || \$r===true ? 'REDIS_OK' : 'REDIS_FAIL'; } catch (Throwable \$e) { echo 'REDIS_FAIL: '.\$e->getMessage(); }" 2>/dev/null | grep -q "REDIS_OK"; then
    green "Redis доступен"
else
    red "Redis недоступен — проверь REDIS_HOST"
fi

# 8. Encryption round-trip (главная защита от инцидента 22.05.2026)
if [[ "$(sudo -u www-data php artisan tinker --execute "echo decrypt(encrypt('ping'));" 2>/dev/null | tail -1)" == "ping" ]]; then
    green "Шифрование работает (decrypt(encrypt) round-trip)"
else
    red "Шифрование сломано — APP_KEY невалидный, портал упадёт на 500"
fi

# 9. config-cache не stale
if [[ -f "$APP_DIR/bootstrap/cache/config.php" ]]; then
    CACHE_AGE=$(( $(date +%s) - $(stat -c %Y "$APP_DIR/bootstrap/cache/config.php") ))
    ENV_AGE=$(( $(date +%s) - $(stat -c %Y "$ENV") ))
    if [[ "$ENV_AGE" -lt "$CACHE_AGE" ]]; then
        red "config.php кэш СТАРШЕ чем .env — запусти: sudo -u www-data php artisan config:cache"
    else
        green "config-кэш свежее .env"
    fi
else
    yellow "config-кэш отсутствует (норма для dev, но в prod лучше иметь)"
fi

# 10. Pending migrations
if cd "$APP_DIR" && sudo -u www-data php artisan migrate:status 2>/dev/null | grep -q "Pending"; then
    yellow "Есть pending миграции — запусти: sudo -u www-data php artisan migrate --force"
else
    green "Миграции применены"
fi

# 11. HTTP smoke
HTTP=$(curl -sS -k --max-time 5 -H "Host: liderra.ru" -o /dev/null -w "%{http_code}" https://127.0.0.1/ 2>/dev/null || echo "000")
case "$HTTP" in
    200|301|302|401|403) green "HTTP smoke: $HTTP" ;;
    *)                   red "HTTP smoke: $HTTP — портал не отвечает" ;;
esac

echo
if [[ "$FAIL" -eq 0 ]]; then
    green "ВСЁ ОК — можно перезапускать сервисы (sudo systemctl reload php8.3-fpm; sudo systemctl restart liderra-queue)"
    exit 0
else
    red "ЕСТЬ ПРОВАЛЫ — НЕ ЗАПУСКАЙ systemctl restart, сначала почини выше"
    exit 1
fi
