#!/bin/bash
set -euo pipefail

DEPLOY_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
ENV_FILE="${DEPLOY_DIR}/.env"

while [[ $# -gt 0 ]]; do
  case "$1" in
    --env-file)
      ENV_FILE="$2"
      shift 2
      ;;
    *)
      echo "Unknown argument: $1"
      exit 1
      ;;
  esac
done

echo "============================================"
echo " Puerto de Mahon Backend Installer"
echo " Deploy dir: ${DEPLOY_DIR}"
echo "============================================"

command -v docker >/dev/null 2>&1 || { echo "ERROR: docker not found"; exit 1; }
docker compose version >/dev/null 2>&1 || { echo "ERROR: docker compose plugin not found"; exit 1; }

if [[ ! -f "${ENV_FILE}" ]]; then
  if [[ -f "${DEPLOY_DIR}/.env.example" ]]; then
    cp "${DEPLOY_DIR}/.env.example" "${ENV_FILE}"
    echo "Created ${ENV_FILE} from .env.example. Edit it before rerunning."
    exit 1
  fi
  echo "ERROR: .env not found"
  exit 1
fi

set -a
source "${ENV_FILE}"
set +a

cd "${DEPLOY_DIR}"

echo "[1/4] Starting PostgreSQL..."
docker compose up -d database

echo "Waiting for PostgreSQL to become healthy..."
timeout=60
elapsed=0
until docker compose exec -T database pg_isready -U "${DB_USER}" -d "${DB_DATABASE}" >/dev/null 2>&1; do
  sleep 2
  elapsed=$((elapsed + 2))
  if [[ ${elapsed} -ge ${timeout} ]]; then
    echo "ERROR: PostgreSQL did not become ready in ${timeout}s"
    docker compose logs database
    exit 1
  fi
done

DUMP_FILE="${DEPLOY_DIR}/db_dump.sql"
if [[ -f "${DUMP_FILE}" ]]; then
  echo "[2/4] Restoring database dump..."
  docker compose exec -T database psql -U "${DB_USER}" -d postgres -c "DROP DATABASE IF EXISTS ${DB_DATABASE};" >/dev/null 2>&1 || true
  docker compose exec -T database psql -U "${DB_USER}" -d postgres -c "CREATE DATABASE ${DB_DATABASE};" >/dev/null 2>&1 || true
  docker compose exec -T database psql -U "${DB_USER}" -d "${DB_DATABASE}" < "${DUMP_FILE}"
else
  echo "[2/4] No db_dump.sql found, skipping restore."
fi

UPLOADS_DIR="${DEPLOY_DIR}/uploads"
if [[ -d "${UPLOADS_DIR}" ]] && [[ -n "$(ls -A "${UPLOADS_DIR}" 2>/dev/null)" ]]; then
  echo "[3/4] Restoring uploads..."
  docker run --rm \
    -v "${UPLOADS_DIR}:/source:ro" \
    -v "$(basename "${DEPLOY_DIR}")_directus_uploads:/directus/uploads" \
    alpine sh -c "cp -r /source/. /directus/uploads/"
else
  echo "[3/4] No uploads to restore."
fi

echo "[4/4] Starting Directus..."
docker compose up -d directus

echo "Waiting for Directus health check..."
timeout=120
elapsed=0
until docker compose exec -T directus wget -qO- http://127.0.0.1:8055/server/health 2>/dev/null | grep -q "ok"; do
  sleep 5
  elapsed=$((elapsed + 5))
  if [[ ${elapsed} -ge ${timeout} ]]; then
    echo "WARNING: Directus health check timed out. Check logs with: docker compose logs -f directus"
    break
  fi
done

echo "Done."
echo "Public URL: ${PUBLIC_URL:-http://localhost:${DIRECTUS_PORT:-8055}}"
