#!/bin/sh
set -eu

ACTION="${1:-run}"
SKIP_INSTALL="${SKIP_INSTALL:-0}"
SKIP_MIGRATION="${SKIP_MIGRATION:-0}"
PRISMA_BIN="./node_modules/.bin/prisma"
STATUS_FILE="./.ttm-prisma-runtime-status-$$"
SHARED_ROOT="../ttm-shared"

cleanup() {
  rm -f "$STATUS_FILE"
}

trap cleanup EXIT INT TERM HUP

ensure_runtime_prerequisites() {
  [ -f package.json ]
  [ -f dist/server.js ]

  echo "[finalize-api] vérification runtime Node/npm"
  node -v
  npm -v
}

run_install_if_needed() {
  if [ "$SKIP_INSTALL" != "1" ]; then
    echo "[finalize-api] npm install/ci (TTM_API)"
    if [ -f package-lock.json ]; then
      npm ci
    else
      npm install
    fi

    if [ -f "$SHARED_ROOT/package.json" ]; then
      echo "[finalize-api] npm install/ci (ttm-shared)"
      (
        cd "$SHARED_ROOT"
        if [ -f package-lock.json ]; then
          npm ci
        else
          npm install
        fi
      )
    else
      echo "[finalize-api] ttm-shared introuvable, installation dédiée ignorée"
    fi
  else
    echo "[finalize-api] install ignoré"
  fi
}

ensure_prisma_ready() {
  [ -x "$PRISMA_BIN" ] || { echo "[finalize-api] Prisma CLI introuvable: $PRISMA_BIN" >&2; exit 1; }
}

resolve_tsconfig_aliases() {
  # Re-résout les alias TypeScript (@/...) dans le dist/ existant.
  # Indispensable quand le build local a été transféré sans tsc-alias,
  # ou quand des modules référencent ttm-shared via des chemins absolus.
  TSC_ALIAS_BIN="./node_modules/.bin/tsc-alias"
  if [ ! -d dist ]; then
    echo "[finalize-api] dist/ absent, tsc-alias ignoré"
    return 0
  fi
  if [ -x "$TSC_ALIAS_BIN" ]; then
    echo "[finalize-api] tsc-alias (resolve @/* dans dist/)"
    "$TSC_ALIAS_BIN" || {
      status=$?
      echo "[finalize-api] tsc-alias a retourné $status (non bloquant)" >&2
    }
  elif command -v npx >/dev/null 2>&1; then
    echo "[finalize-api] tsc-alias via npx (fallback)"
    npx --yes tsc-alias || {
      status=$?
      echo "[finalize-api] npx tsc-alias a retourné $status (non bloquant)" >&2
    }
  else
    echo "[finalize-api] tsc-alias introuvable (bin et npx absents), étape ignorée" >&2
  fi
}

run_prisma_generate() {
  echo "[finalize-api] prisma generate"
  "$PRISMA_BIN" generate
}

run_prisma_migrate() {
  echo "[finalize-api] prisma migrate status"
  if "$PRISMA_BIN" migrate status; then
    :
  else
    status=$?
    echo "[finalize-api] prisma migrate status a retourné $status ; poursuite vers prisma migrate deploy" >&2
  fi
  echo "[finalize-api] prisma migrate deploy"
  "$PRISMA_BIN" migrate deploy
}

status_mode() {
  printf 'packageJson=%s\n' "$(if [ -f package.json ]; then echo 1; else echo 0; fi)"
  printf 'distServer=%s\n' "$(if [ -f dist/server.js ]; then echo 1; else echo 0; fi)"
  printf 'node=%s\n' "$(if command -v node >/dev/null 2>&1; then echo 1; else echo 0; fi)"
  printf 'npm=%s\n' "$(if command -v npm >/dev/null 2>&1; then echo 1; else echo 0; fi)"
  printf 'databaseUrl=%s\n' "$(if [ -n "${DATABASE_URL:-}" ]; then echo 1; else echo 0; fi)"
  printf 'prismaBin=%s\n' "$(if [ -x "$PRISMA_BIN" ]; then echo 1; else echo 0; fi)"

  if [ ! -f package.json ] || [ ! -f dist/server.js ] || ! command -v node >/dev/null 2>&1 || ! command -v npm >/dev/null 2>&1 || [ ! -x "$PRISMA_BIN" ] || [ -z "${DATABASE_URL:-}" ]; then
    printf 'migrateStatus=skipped\n'
    exit 0
  fi

  if "$PRISMA_BIN" migrate status > "$STATUS_FILE" 2>&1; then
    printf 'migrateStatus=ok\n'
  else
    printf 'migrateStatus=error\n'
  fi

  cat "$STATUS_FILE" 2>/dev/null || true
}

if [ "$ACTION" = "status" ]; then
  status_mode
  exit 0
fi

if [ "$ACTION" = "run" ]; then
  echo "[finalize-api] mode historique 'run' accepté pour compatibilité : bascule vers finalize sans migration implicite"
  ACTION="finalize"
fi

case "$ACTION" in
  finalize)
    ensure_runtime_prerequisites
    run_install_if_needed
    resolve_tsconfig_aliases
    ensure_prisma_ready
    run_prisma_generate
    if [ "$SKIP_MIGRATION" = "1" ]; then
      echo "[finalize-api] SKIP_MIGRATION accepté pour compatibilité, sans effet : finalize ne lance plus de migration"
    fi
    echo "[finalize-api] finalisation terminée"
    ;;
  migrate)
    ensure_runtime_prerequisites
    run_install_if_needed
    resolve_tsconfig_aliases
    ensure_prisma_ready
    run_prisma_generate
    run_prisma_migrate
    echo "[finalize-api] migration terminée"
    ;;
  *)
    echo "[finalize-api] action inconnue: $ACTION" >&2
    exit 1
    ;;
esac

