#!/usr/bin/env bash
# Production Launch Checklist
# Usage: ./scripts/launch-checklist.sh
#
# Performs automated checks where possible and prints manual check reminders.

set -euo pipefail

PASS=0
FAIL=0
MANUAL=0

auto_check() {
    local label="$1"
    local result="$2"

    if [ "$result" = "true" ]; then
        echo "  PASS  $label"
        PASS=$((PASS + 1))
    else
        echo "  FAIL  $label"
        FAIL=$((FAIL + 1))
    fi
}

manual_check() {
    local label="$1"
    echo "  TODO  $label"
    MANUAL=$((MANUAL + 1))
}

echo ""
echo "=== Production Launch Checklist ==="
echo ""

# ── Environment ─────────────────────────────────────────────────
echo "Environment:"
APP_ENV=$(php artisan tinker --execute="echo config('app.env');" 2>/dev/null || echo "unknown")
auto_check "APP_ENV=production" "$([ "$APP_ENV" = "production" ] && echo true || echo false)"

APP_DEBUG=$(php artisan tinker --execute="echo config('app.debug') ? 'true' : 'false';" 2>/dev/null || echo "unknown")
auto_check "APP_DEBUG=false" "$([ "$APP_DEBUG" = "false" ] && echo true || echo false)"

APP_KEY=$(php artisan tinker --execute="echo empty(config('app.key')) ? 'empty' : 'set';" 2>/dev/null || echo "unknown")
auto_check "APP_KEY is set" "$([ "$APP_KEY" = "set" ] && echo true || echo false)"

echo ""

# ── Database ─────────────────────────────────────────────────────
echo "Database:"
DB_OK=$(php artisan tinker --execute="try { DB::connection()->getPdo(); echo 'ok'; } catch (\Exception \$e) { echo 'fail'; }" 2>/dev/null || echo "fail")
auto_check "Database connection" "$([ "$DB_OK" = "ok" ] && echo true || echo false)"

PENDING=$(php artisan migrate:status 2>/dev/null | grep -c "Pending" || echo "0")
auto_check "No pending migrations" "$([ "$PENDING" = "0" ] && echo true || echo false)"

echo ""

# ── Infrastructure ───────────────────────────────────────────────
echo "Infrastructure:"
QUEUE_DRIVER=$(php artisan tinker --execute="echo config('queue.default');" 2>/dev/null || echo "unknown")
auto_check "Queue driver not sync" "$([ "$QUEUE_DRIVER" != "sync" ] && echo true || echo false)"

CACHE_DRIVER=$(php artisan tinker --execute="echo config('cache.default');" 2>/dev/null || echo "unknown")
auto_check "Cache driver not file" "$([ "$CACHE_DRIVER" != "file" ] && echo true || echo false)"

echo ""

# ── Security ─────────────────────────────────────────────────────
echo "Security:"
auto_check "Composer audit clean" "$(composer audit --no-interaction 2>/dev/null && echo true || echo false)"
auto_check "NPM audit (critical)" "$(npm audit --audit-level=critical 2>/dev/null && echo true || echo false)"

echo ""

# ── Manual Checks ────────────────────────────────────────────────
echo "Manual Checks (verify these yourself):"
manual_check "Stripe webhooks point to production URL"
manual_check "GSC OAuth redirect URIs include production domain"
manual_check "DNS configured and propagated"
manual_check "SSL certificate valid and not expiring soon"
manual_check "Error tracking active (Sentry DSN configured)"
manual_check "Backup schedule verified (daily at 02:00)"
manual_check "Queue workers running (systemd/supervisor)"
manual_check "Cron job configured (* * * * * php artisan schedule:run)"
manual_check "Mail driver configured (not smtp/localhost in production)"
manual_check "Trusted proxies configured (if behind CDN/load balancer)"
manual_check "CORS allowed origins updated for production domain"

echo ""
echo "=================================================="
echo "Results: $PASS passed, $FAIL failed, $MANUAL manual checks"
echo ""

if [ "$FAIL" -gt 0 ]; then
    echo "LAUNCH CHECKLIST: NOT READY ($FAIL failures)"
    exit 1
fi

echo "LAUNCH CHECKLIST: Automated checks passed. Complete manual checks above."
exit 0
