#!/usr/bin/env bash
set -euo pipefail

ROOT="${1:-$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)}"
ENV_FILE="${2:-$ROOT/.env}"
if [[ ! -r "$ENV_FILE" ]]; then
  echo "Environment file is not readable: $ENV_FILE" >&2
  exit 2
fi
ENV_LINK_CREATED=false
if [[ "$ENV_FILE" != "$ROOT/.env" ]]; then
  ln -sfn "$ENV_FILE" "$ROOT/.env"
  ENV_LINK_CREATED=true
fi

read_env() {
  local key="$1"
  awk -F= -v key="$key" '$1 == key {sub(/^[^=]*=/, ""); print; exit}' "$ENV_FILE"
}

DB_HOST="$(read_env DB_HOST)"
DB_PORT="$(read_env DB_PORT)"
DB_USER="$(read_env DB_USER)"
DB_PASS="$(read_env DB_PASS)"
TEST_DB="yokesen_workshop_test_$(date -u +%Y%m%d%H%M%S)"
HTTP_ROOT="${ROOT}-http-${TEST_DB}"
HTTP_PID=""
MYSQL_ROOT=(mysql)
MYSQL_APP=(mysql -h "$DB_HOST" -P "${DB_PORT:-3306}" -u "$DB_USER" "-p$DB_PASS")
PHP=(php -d display_errors=1 -d error_reporting=E_ALL)

cleanup() {
  local exit_status=$?
  if [[ -n "$HTTP_PID" ]]; then
    kill "$HTTP_PID" >/dev/null 2>&1 || true
    wait "$HTTP_PID" 2>/dev/null || true
  fi
  if [[ "$exit_status" -ne 0 && -f "$HTTP_ROOT/http.log" ]]; then
    echo "--- workshop HTTP server log (verification failed) ---" >&2
    tail -n 120 "$HTTP_ROOT/http.log" >&2 || true
  fi
  rm -rf "$HTTP_ROOT"
  "${MYSQL_ROOT[@]}" -e "DROP DATABASE IF EXISTS \`$TEST_DB\`;" >/dev/null 2>&1 || true
  if [[ "$ENV_LINK_CREATED" == true ]]; then
    rm -f "$ROOT/.env"
  fi
}
trap cleanup EXIT

"${MYSQL_ROOT[@]}" -e "CREATE DATABASE \`$TEST_DB\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; GRANT ALL PRIVILEGES ON \`$TEST_DB\`.* TO '$DB_USER'@'localhost'; FLUSH PRIVILEGES;"

for migration in 000_migration_registry.sql 001_init.sql 002_auth.sql 003_workshop_commercial.sql 004_workshop_booking_payment.sql 005_workshop_payment_lifecycle.sql 006_workshop_notification_delivery.sql; do
  "${MYSQL_APP[@]}" "$TEST_DB" < "$ROOT/migrations/$migration"
done

"${PHP[@]}" "$ROOT/tests/commercial_unit.php"
"${PHP[@]}" "$ROOT/tests/workshop_unit.php"
"${PHP[@]}" "$ROOT/tests/commercial_db_integration.php" "$ROOT" "$TEST_DB"
"${PHP[@]}" "$ROOT/tests/workshop_db_integration.php" "$ROOT" "$TEST_DB"

cp -a "$ROOT" "$HTTP_ROOT"
rm -f "$HTTP_ROOT/.env"
awk -v db="$TEST_DB" '
  BEGIN { seen_booking=0; seen_payment=0; seen_service=0; seen_privacy=0; seen_debug=0; seen_notify_key=0; seen_currency=0; }
  /^DB_NAME=/ { print "DB_NAME=" db; next }
  /^COMMERCIAL_API_ENABLED=/ { print "COMMERCIAL_API_ENABLED=true"; next }
  /^COMMERCIAL_SERVICE_TOKEN=/ { print "COMMERCIAL_SERVICE_TOKEN=http-contract-service-token"; seen_service=1; next }
  /^COMMERCIAL_CONTEXT_HMAC_SECRET=/ { print "COMMERCIAL_CONTEXT_HMAC_SECRET=http-contract-hmac-secret-32-bytes-minimum"; next }
  /^WORKSHOP_BOOKING_API_ENABLED=/ { print "WORKSHOP_BOOKING_API_ENABLED=true"; seen_booking=1; next }
  /^WORKSHOP_PAYMENT_API_ENABLED=/ { print "WORKSHOP_PAYMENT_API_ENABLED=true"; seen_payment=1; next }
  /^WORKSHOP_PRIVACY_POLICY_VERSION=/ { print "WORKSHOP_PRIVACY_POLICY_VERSION=2026-07-18"; seen_privacy=1; next }
  /^WORKSHOP_NOTIFICATION_ENCRYPTION_KEY_B64=/ { print "WORKSHOP_NOTIFICATION_ENCRYPTION_KEY_B64=bm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm4="; seen_notify_key=1; next }
  /^CURRENCYAPI_ENABLED=/ { print "CURRENCYAPI_ENABLED=false"; seen_currency=1; next }
  /^MIDTRANS_STATUS_CHALLENGE_ENABLED=/ { print "MIDTRANS_STATUS_CHALLENGE_ENABLED=false"; next }
  /^APP_DEBUG=/ { print "APP_DEBUG=true"; seen_debug=1; next }
  { print }
  END {
    if (!seen_service) print "COMMERCIAL_SERVICE_TOKEN=http-contract-service-token"
    if (!seen_booking) print "WORKSHOP_BOOKING_API_ENABLED=true"
    if (!seen_payment) print "WORKSHOP_PAYMENT_API_ENABLED=true"
    if (!seen_privacy) print "WORKSHOP_PRIVACY_POLICY_VERSION=2026-07-18"
    if (!seen_notify_key) print "WORKSHOP_NOTIFICATION_ENCRYPTION_KEY_B64=bm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm5ubm4="
    if (!seen_currency) print "CURRENCYAPI_ENABLED=false"
    if (!seen_debug) print "APP_DEBUG=true"
    print "MIDTRANS_STATUS_CHALLENGE_ENABLED=false"
  }
' "$ENV_FILE" > "$HTTP_ROOT/.env"
chmod 600 "$HTTP_ROOT/.env"
HTTP_PORT=$((18000 + RANDOM % 1000))
php -S "127.0.0.1:$HTTP_PORT" -t "$HTTP_ROOT/public" "$HTTP_ROOT/public/index.php" >"$HTTP_ROOT/http.log" 2>&1 &
HTTP_PID=$!
for _ in {1..30}; do
  if curl -fsS "http://127.0.0.1:$HTTP_PORT/health" >/dev/null; then
    break
  fi
  sleep 0.2
done
curl -fsS "http://127.0.0.1:$HTTP_PORT/health" >/dev/null
python3 "$HTTP_ROOT/tests/workshop_http_contract.py" "http://127.0.0.1:$HTTP_PORT" "http-contract-service-token"
python3 "$HTTP_ROOT/tests/agent_protocol_http_contract.py" "http://127.0.0.1:$HTTP_PORT"

CRM_PAID_COUNT="$("${MYSQL_APP[@]}" -N "$TEST_DB" -e "SELECT COUNT(*) FROM workshop_bookings b JOIN crm_opportunities o ON o.opportunity_id=b.opportunity_id WHERE b.status='paid' AND o.stage='paid'")"
if [[ "$CRM_PAID_COUNT" -lt 1 ]]; then
  echo "Paid workshop booking did not converge its CRM opportunity to paid" >&2
  exit 1
fi
PAYMENT_OUTBOX_COUNT="$("${MYSQL_APP[@]}" -N "$TEST_DB" -e "SELECT COUNT(*) FROM workshop_notification_outbox WHERE template_code='workshop_payment_received'")"
PAYMENT_OUTBOX_DUPLICATES="$("${MYSQL_APP[@]}" -N "$TEST_DB" -e "SELECT COUNT(*) FROM (SELECT booking_id FROM workshop_notification_outbox WHERE template_code='workshop_payment_received' GROUP BY booking_id HAVING COUNT(*) > 1) duplicate_notifications")"
if [[ "$PAYMENT_OUTBOX_COUNT" -lt 2 || "$PAYMENT_OUTBOX_DUPLICATES" -ne 0 ]]; then
  echo "Paid workshop bookings did not enqueue exactly one payment-received notification each across replay" >&2
  exit 1
fi
CLOSED_UNPAID_COUNT="$("${MYSQL_APP[@]}" -N "$TEST_DB" -e "SELECT COUNT(*) FROM workshop_bookings b JOIN workshop_invoices i ON i.booking_id=b.booking_id JOIN workshop_offers o ON o.offer_id=i.offer_id JOIN workshop_slot_inventory s ON s.slot_id=b.slot_id JOIN crm_opportunities c ON c.opportunity_id=b.opportunity_id WHERE b.status='cancelled' AND i.status IN ('cancelled','expired') AND o.status IN ('cancelled','expired') AND s.status='available' AND c.stage='lost'")"
if [[ "$CLOSED_UNPAID_COUNT" -lt 3 ]]; then
  echo "Unpaid cancellation/expiry did not close booking, invoice, offer, slot, and CRM together" >&2
  exit 1
fi
INTERNATIONAL_ESTIMATE_COUNT="$("${MYSQL_APP[@]}" -N "$TEST_DB" -e "SELECT COUNT(*) FROM commercial_estimates WHERE destination_country='ZA' AND total_blocked_travel_days=4 AND opportunity_cost_idr=400000000 AND offshore_buffer_idr=100000000 AND estimated_blocking_fee_idr=500000000")"
if [[ "$INTERNATIONAL_ESTIMATE_COUNT" -lt 2 ]]; then
  echo "International blocking-time estimates did not preserve the four-day policy math" >&2
  exit 1
fi
FX_INVOICE_COUNT="$("${MYSQL_APP[@]}" -N "$TEST_DB" -e "SELECT COUNT(*) FROM workshop_invoices WHERE invoice_currency='EUR' AND invoice_amount=25000 AND charge_currency='IDR' AND charge_amount=500000000 AND fx_rate=20000")"
if [[ "$FX_INVOICE_COUNT" -ne 1 ]]; then
  echo "Finance-approved non-IDR invoice did not preserve its exact IDR charge and FX disclosure" >&2
  exit 1
fi

before="$({ "${MYSQL_APP[@]}" -N "$TEST_DB" -e 'SHOW TABLES'; } | grep -v '^workshop_' | sort)"
"${MYSQL_APP[@]}" "$TEST_DB" < "$ROOT/migrations/006_workshop_notification_delivery_rollback.sql"
"${MYSQL_APP[@]}" "$TEST_DB" < "$ROOT/migrations/004_workshop_booking_payment_rollback.sql"
"${MYSQL_APP[@]}" "$TEST_DB" -e "DELETE FROM migrations WHERE migration='005_workshop_payment_lifecycle'"
after="$({ "${MYSQL_APP[@]}" -N "$TEST_DB" -e 'SHOW TABLES'; } | sort)"
if [[ "$before" != "$after" ]]; then
  echo "Rollback changed tables outside the workshop migration boundary" >&2
  diff -u <(printf '%s\n' "$before") <(printf '%s\n' "$after") || true
  exit 1
fi

echo "verify_workshop_db: PASS ($TEST_DB)"
