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

ROOT_DIR=$(cd "$(dirname "$0")/.." && pwd)
DOCKER_DIR="$ROOT_DIR/docker"
COMPOSE_FILE="$DOCKER_DIR/docker-compose.local.yml"

echo "==> FailDaily deploy (Docker)"

if ! command -v docker >/dev/null 2>&1; then
  echo "ERROR: docker not found" >&2; exit 1
fi
if ! docker compose version >/dev/null 2>&1; then
  echo "ERROR: docker compose plugin not found" >&2; exit 1
fi

# Load DB vars from docker/.env
if [ -f "$DOCKER_DIR/.env" ]; then
  # shellcheck disable=SC2046
  export $(grep -E '^(DB_NAME|DB_ROOT_PASSWORD|MYSQL_ROOT_PASSWORD)=' "$DOCKER_DIR/.env" | xargs -d '\n') || true
fi
DB_NAME=${DB_NAME:-faildaily}
DB_ROOT_PASSWORD=${DB_ROOT_PASSWORD:-${MYSQL_ROOT_PASSWORD:-root}}

# If docker/.env.local is missing but docker/.env exists (common in CI), reuse it.
if [ ! -f "$DOCKER_DIR/.env.local" ] && [ -f "$DOCKER_DIR/.env" ]; then
  cp "$DOCKER_DIR/.env" "$DOCKER_DIR/.env.local"
fi

compose() {
  (cd "$DOCKER_DIR" && docker compose -f "$COMPOSE_FILE" "$@")
}

echo "==> Bringing up database..."
compose up -d db

echo "==> Waiting for MySQL readiness..."
TRIES=60
until compose exec -T db sh -lc "mysqladmin ping -h 127.0.0.1 -uroot -p\"$DB_ROOT_PASSWORD\" --silent" >/dev/null 2>&1; do
  TRIES=$((TRIES-1))
  if [ "$TRIES" -le 0 ]; then echo "ERROR: MySQL not ready" >&2; exit 1; fi
  sleep 2
done
echo "MySQL ready"

echo "==> Ensuring database $DB_NAME exists..."
compose exec -T db sh -lc "mysql -uroot -p\"$DB_ROOT_PASSWORD\" -e 'CREATE DATABASE IF NOT EXISTS \`$DB_NAME\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;'"

	echo "==> Checking existing schema..."
	HAS_USERS=$(compose exec -T db sh -lc "mysql -N -uroot -p\"$DB_ROOT_PASSWORD\" -e \"SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='$DB_NAME' AND table_name='users'\"") || HAS_USERS=0
	if [ "${HAS_USERS:-0}" -eq 0 ]; then
	  echo "==> Importing base schema..."
	  SCHEMA_FILE=""
	  if [ -f "$ROOT_DIR/backend-api/migrations/faildaily.sql" ]; then
	    SCHEMA_FILE="$ROOT_DIR/backend-api/migrations/faildaily.sql"
	  elif [ -f "$ROOT_DIR/database-schema.sql" ]; then
	    echo "backend-api/migrations/faildaily.sql not found; falling back to database-schema.sql"
	    SCHEMA_FILE="$ROOT_DIR/database-schema.sql"
	  else
	    echo "ERROR: No schema file found (expected backend-api/migrations/faildaily.sql or database-schema.sql)" >&2
	    exit 1
	  fi
	  cat "$SCHEMA_FILE" | compose exec -T db sh -lc "mysql -uroot -p\"$DB_ROOT_PASSWORD\" \"$DB_NAME\""
	else
	  echo "==> Schema detected, skipping base import"
	fi

	echo "==> Applying additional migrations (*.sql)"
	for f in "$ROOT_DIR/backend-api/migrations"/*.sql; do
	  base=$(basename "$f")
	  if echo "$base" | grep -Eq '^[0-9]{3}_.+\.sql$|^[0-9]{4}-[0-9]{2}-[0-9]{2}_.+\.sql$'; then
	    echo "Applying migration: $base"
	    cat "$f" | compose exec -T db sh -lc "mysql -uroot -p\"$DB_ROOT_PASSWORD\" \"$DB_NAME\"" || true
	  else
	    echo "Skipping non-migration SQL: $base"
	  fi
	done

echo "==> Building and starting Traefik, backend, frontend..."
SERVICES=(traefik backend frontend)
if compose config --services 2>/dev/null | grep -qx "admin_frontend"; then
  SERVICES+=(admin_frontend)
fi
compose up -d "${SERVICES[@]}"

echo "==> Verifying backend health from container..."
compose exec -T backend sh -lc "apk add --no-cache curl >/dev/null 2>&1 || true; curl -sf http://localhost:3000/health || (echo 'Backend health failed' >&2; exit 1)" >/dev/null
echo "Backend OK"

echo "==> Done. Access the app via http://localhost:8090 (and admin via http://admin.localhost:8090 if enabled)"
