#!/usr/bin/env bash
# Restora — guided local installation, from pre-built images (no source code
# involved). Companion to docker-compose.local.yml / .env.local.example.
# Usage: ./install-local.sh
set -euo pipefail

SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$SCRIPT_DIR"
COMPOSE_FILE="docker-compose.local.yml"
[ -f "$COMPOSE_FILE" ] || COMPOSE_FILE="../../docker-compose.local.yml"
[ -f "$COMPOSE_FILE" ] || { echo "docker-compose.local.yml introuvable — lancez ce script depuis le dossier téléchargé." >&2; exit 1; }
cd "$(dirname "$COMPOSE_FILE")"
COMPOSE_FILE="$(basename "$COMPOSE_FILE")"

bold() { printf "\033[1m%s\033[0m\n" "$1"; }
info() { printf "  -> %s\n" "$1"; }
error() { printf "\033[31m%s\033[0m\n" "$1" >&2; }

bold "Restora — installation locale (auto-hébergée)"
echo

# 1) Check Docker
if ! command -v docker >/dev/null 2>&1; then
  error "Docker n'est pas installé. Installez Docker Desktop (ou Docker Engine + Compose) avant de continuer."
  exit 1
fi
if ! docker compose version >/dev/null 2>&1; then
  error "Docker Compose (plugin v2) est introuvable. Mettez à jour Docker."
  exit 1
fi
info "Docker détecté."

# 2) Ensure .env exists
if [ ! -f .env ]; then
  if [ -f .env.local.example ]; then
    cp .env.local.example .env
    info "Fichier .env créé à partir de .env.local.example."
  else
    error ".env.local.example introuvable et aucun .env existant — téléchargement incomplet."
    exit 1
  fi
else
  info "Fichier .env existant conservé."
fi

# shellcheck disable=SC1091
set -a; source .env; set +a

if [[ "${RESTORA_API_IMAGE:-}" == *"your-org"* ]]; then
  error "Modifiez .env : RESTORA_API_IMAGE / RESTORA_WEB_IMAGE / RESTORA_WORKER_IMAGE pointent encore vers l'exemple (your-org)."
  error "Remplacez-les par les images que vous avez publiées (voir docs/PUBLISHING_IMAGES.md)."
  exit 1
fi

# 3) Ask parameters (tenant/restaurant/admin)
echo
bold "Configuration de votre restaurant"
read -rp "Nom de l'entreprise / tenant [Mon Restaurant]: " TENANT_NAME
TENANT_NAME=${TENANT_NAME:-"Mon Restaurant"}
TENANT_SLUG=$(echo "$TENANT_NAME" | tr '[:upper:]' '[:lower:]' | tr -s ' ' '-' | tr -cd 'a-z0-9-')

read -rp "Nom de l'établissement (restaurant) [${TENANT_NAME}]: " RESTAURANT_NAME
RESTAURANT_NAME=${RESTAURANT_NAME:-$TENANT_NAME}
RESTAURANT_SLUG=$(echo "$RESTAURANT_NAME" | tr '[:upper:]' '[:lower:]' | tr -s ' ' '-' | tr -cd 'a-z0-9-')

read -rp "E-mail de l'administrateur: " ADMIN_EMAIL
while [ -z "$ADMIN_EMAIL" ]; do
  read -rp "E-mail requis, réessayez: " ADMIN_EMAIL
done

read -rsp "Mot de passe administrateur (min. 8 caractères): " ADMIN_PASSWORD
echo
while [ ${#ADMIN_PASSWORD} -lt 8 ]; do
  read -rsp "Trop court, réessayez (min. 8 caractères): " ADMIN_PASSWORD
  echo
done

# 4) Generate a real JWT secret if still the placeholder
if grep -q "change_me_run_openssl_rand_hex_32" .env 2>/dev/null; then
  if command -v openssl >/dev/null 2>&1; then
    NEW_SECRET=$(openssl rand -hex 32)
    sed -i.bak "s/change_me_run_openssl_rand_hex_32/${NEW_SECRET}/" .env && rm -f .env.bak
    info "Secret JWT généré."
  else
    error "openssl introuvable — générez vous-même un secret et remplacez JWT_ACCESS_SECRET dans .env avant de continuer."
    exit 1
  fi
fi

# 5) Pull images and start services
echo
bold "Téléchargement des images Docker..."
docker compose -f "$COMPOSE_FILE" pull
bold "Démarrage des services..."
docker compose -f "$COMPOSE_FILE" up -d
info "Services démarrés."

# 6) Wait for the API to be healthy — the image's own startup command
# (see docker-compose.local.yml) already runs `prisma migrate deploy`
# before the server starts listening, so a passing health check also
# confirms migrations succeeded — no separate migration step needed here.
echo
bold "Attente de l'API..."
until docker compose -f "$COMPOSE_FILE" exec -T api wget -qO- http://localhost:3000/api/health >/dev/null 2>&1; do
  printf "."
  sleep 3
done
echo " OK"

# 7) Load reference data (currencies, permissions, payment providers, …).
# Idempotent — safe to run again if this script is re-run.
echo
bold "Chargement des données de référence..."
docker compose -f "$COMPOSE_FILE" exec -T api node prisma/seed.ts
info "Données de référence chargées."

# 8) Create the restaurant and its administrator
bold "Création de votre restaurant et de son administrateur..."
docker compose -f "$COMPOSE_FILE" exec -T \
  -e TENANT_NAME="$TENANT_NAME" \
  -e TENANT_SLUG="$TENANT_SLUG" \
  -e RESTAURANT_NAME="$RESTAURANT_NAME" \
  -e RESTAURANT_SLUG="$RESTAURANT_SLUG" \
  -e ADMIN_EMAIL="$ADMIN_EMAIL" \
  -e ADMIN_PASSWORD="$ADMIN_PASSWORD" \
  api node prisma/create-tenant-admin.ts
info "Restaurant et administrateur créés."

# 9) Show URLs
echo
bold "Installation terminée."
echo
echo "  Application web : http://localhost:${WEB_PORT:-3001}"
echo "  (depuis un autre appareil du réseau : remplacez localhost par l'adresse IP de ce serveur)"
echo "  API             : http://localhost:${API_PORT:-3000}/api"
echo
echo "  Compte administrateur : ${ADMIN_EMAIL}"
echo
echo "  Pensez à définir l'URL de base dans Configuration → Paramètres avancés"
echo "  avec l'adresse IP réelle de ce serveur, pour que les QR codes de table"
echo "  fonctionnent depuis les téléphones du personnel et des clients."
echo

bold "État des services :"
docker compose -f "$COMPOSE_FILE" ps
