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

ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
CONTAINER_NAME="${CI_MYSQL_CONTAINER_NAME:-faildaily-ci-mysql}"
MYSQL_PORT="${CI_MYSQL_PORT:-13306}"
MYSQL_ROOT_PASSWORD="${CI_MYSQL_ROOT_PASSWORD:-root}"
MYSQL_DATABASE="${CI_MYSQL_DATABASE:-faildaily}"
JEST_ARGS=("$@")

cleanup() {
  docker rm -f "$CONTAINER_NAME" >/dev/null 2>&1 || true
}
trap cleanup EXIT

cd "$ROOT_DIR"

if ! command -v docker >/dev/null 2>&1; then
  echo "docker not found. Install Docker Desktop / Docker Engine first." >&2
  exit 1
fi

echo "🐬 Starting MySQL container: $CONTAINER_NAME (port $MYSQL_PORT)"
docker rm -f "$CONTAINER_NAME" >/dev/null 2>&1 || true
docker run -d --name "$CONTAINER_NAME" \
  -e "MYSQL_ROOT_PASSWORD=$MYSQL_ROOT_PASSWORD" \
  -e "MYSQL_DATABASE=$MYSQL_DATABASE" \
  -p "$MYSQL_PORT:3306" \
  mysql:8.0 \
  --default-authentication-plugin=mysql_native_password \
  --character-set-server=utf8mb4 \
  --collation-server=utf8mb4_unicode_ci >/dev/null

echo "⏳ Waiting for MySQL to be ready..."
for _ in $(seq 1 60); do
  if docker exec "$CONTAINER_NAME" mysqladmin ping -h 127.0.0.1 -uroot -p"$MYSQL_ROOT_PASSWORD" --silent >/dev/null 2>&1; then
    break
  fi
  sleep 2
done

docker exec "$CONTAINER_NAME" mysqladmin ping -h 127.0.0.1 -uroot -p"$MYSQL_ROOT_PASSWORD" --silent >/dev/null
echo "✅ MySQL is ready"

echo "📥 Importing schema + migrations into $MYSQL_DATABASE..."
SCHEMA_FILE=""
if [[ -f backend-api/migrations/faildaily.sql ]]; then
  SCHEMA_FILE="backend-api/migrations/faildaily.sql"
elif [[ -f database-schema.sql ]]; then
  echo "backend-api/migrations/faildaily.sql not found; falling back to database-schema.sql"
  SCHEMA_FILE="database-schema.sql"
else
  echo "No schema file found (expected backend-api/migrations/faildaily.sql or database-schema.sql)" >&2
  exit 1
fi

cat "$SCHEMA_FILE" | docker exec -i "$CONTAINER_NAME" mysql -uroot -p"$MYSQL_ROOT_PASSWORD" "$MYSQL_DATABASE"

while IFS= read -r f; do
  base="$(basename "$f")"
  if [[ "$base" =~ ^[0-9]{3}_.+\.sql$|^[0-9]{4}-[0-9]{2}-[0-9]{2}_.+\.sql$ ]]; then
    echo "  - Applying: $base"
    cat "$f" | docker exec -i "$CONTAINER_NAME" mysql -uroot -p"$MYSQL_ROOT_PASSWORD" "$MYSQL_DATABASE"
  else
    echo "  - Skipping non-migration SQL: $base"
  fi
done < <(ls -1 backend-api/migrations/*.sql | sort)

echo "📦 Installing backend dependencies..."
cd backend-api
if [[ -f package-lock.json ]]; then
  npm ci
else
  npm install
fi

echo "🧪 Running backend Jest suite (CI-like env)..."
export NODE_ENV=test
export DB_HOST=127.0.0.1
export DB_PORT="$MYSQL_PORT"
export DB_NAME="$MYSQL_DATABASE"
export DB_USER=root
export DB_PASSWORD="$MYSQL_ROOT_PASSWORD"
export JWT_SECRET=test_jwt_secret_for_ci
export SMTP_PASS=fake_smtp_pass_ci
export OPENAI_API_KEY=fake_openai_key_ci
export LOGS_DB_HOST=127.0.0.1
export LOGS_DB_PORT="$MYSQL_PORT"
export LOGS_DB_NAME="$MYSQL_DATABASE"
export LOGS_DB_USER=root
export LOGS_DB_PASSWORD="$MYSQL_ROOT_PASSWORD"

export TMPDIR="${TMPDIR:-/tmp}"

npx jest --runInBand "${JEST_ARGS[@]}"
