#!/usr/bin/env bash
# Uji end-to-end: server PHP sungguhan + curl + database nyata.
#
#   DB_NAME=tapaksavar_test bash tests/e2e/auth.sh
#
# Syarat: database uji sudah disiapkan (setup-db + seed) dan akun admin demo tersedia.
set -u

ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
PORT="${E2E_PORT:-8099}"
BASE="http://127.0.0.1:${PORT}/api/v1"
ADMIN_USER="${E2E_USER:-admin.tapak}"
ADMIN_PASS="${E2E_PASS:-Tapak#2026}"
LOG="$(mktemp)"
PASS=0
FAIL=0

case "${DB_NAME:-}" in
  *_test) ;;
  *) echo "Ditolak: jalankan dengan DB_NAME berakhiran _test." >&2; exit 2 ;;
esac

php -d upload_max_filesize=3M -d post_max_size=8M -S "127.0.0.1:${PORT}" -t "${ROOT}/public" "${ROOT}/public/index.php" >"${LOG}" 2>&1 &
SERVER_PID=$!
trap 'kill ${SERVER_PID} 2>/dev/null; rm -f "${LOG}"' EXIT
for _ in $(seq 1 30); do
  curl -s -o /dev/null "${BASE}/health" && break
  sleep 0.2
done

ok()   { PASS=$((PASS+1)); echo "  [LOLOS] $1"; }
bad()  { FAIL=$((FAIL+1)); echo "  [GAGAL] $1 -- $2"; }

# req <metode> <path> [json] [token] -> menyetel STATUS, BODY, CTYPE
req() {
  local method="$1" path="$2" data="${3:-}" token="${4:-}"
  local args=(-s -o /tmp/e2e_body.$$ -w '%{http_code} %{content_type}' -X "$method" "${BASE}${path}")
  [ -n "$data" ]  && args+=(-H 'Content-Type: application/json' -d "$data")
  [ -n "$token" ] && args+=(-H "Authorization: Bearer ${token}")
  local out; out="$(curl "${args[@]}")"
  STATUS="${out%% *}"; CTYPE="${out#* }"; BODY="$(cat /tmp/e2e_body.$$)"; rm -f /tmp/e2e_body.$$
}

expect() { # expect <deskripsi> <status> <kode-error-atau-"-">
  local desc="$1" status="$2" code="$3"
  if [ "$STATUS" != "$status" ]; then bad "$desc" "status ${STATUS}, diharapkan ${status}"; return; fi
  if [ "$code" != "-" ] && [ "$(echo "$BODY" | jq -r '.error.code')" != "$code" ]; then
    bad "$desc" "kode $(echo "$BODY" | jq -r '.error.code'), diharapkan ${code}"; return
  fi
  case "$CTYPE" in application/json*) ;; *) bad "$desc" "Content-Type ${CTYPE}"; return ;; esac
  ok "$desc"
}
