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

APP_DIR="$(readlink -f "$(dirname "${BASH_SOURCE[0]}")/..")"
KEYS_FILE="${APP_DIR}/keys.env"

# Sentinel-файл, чтобы проверить, был ли уже инициализирован администратор
ADMIN_SENTINEL="${APP_DATA_DIR}/.admin_created"

# имя пользователя и адрес электронной почты администратора
ADMIN_NAME="DFWebOS"
ADMIN_EMAIL="dfwebos@dfwebos.local"

# максимальное количество попыток и время ожидания между ними (60 секунд)
MAX_TRIES=12
SLEEP_SECS=5

# ────────────────────────────────────────────────────────────
# Полностью пропустить загрузку, если администратор уже инициализирован.
# ────────────────────────────────────────────────────────────
if [[ -f "$ADMIN_SENTINEL" ]]; then
  echo "Solidtime: admin already initialised - skipping bootstrap."
  exit 0
fi

# ────────────────────────────────────────────────────────────
# Убедитесь, что keys.env существует.
# ────────────────────────────────────────────────────────────
if [[ ! -s "$KEYS_FILE" ]]; then
  echo "Solidtime: generating keys.env…"
  "${DFWEBOS_ROOT}/scripts/app" compose "${APP_ID}" \
    run --rm app php artisan self-host:generate-keys \
  | grep -v "Container mode:" > "$KEYS_FILE"
fi

# ────────────────────────────────────────────────────────────
# Подключите весь стек, чтобы миграция выполнялась автоматически.
# Вероятно, здесь можно вызвать только необходимые сервисы, но делаем это для простоты.
# --wait игнорируется в старых версиях Compose (DFWebOS < 1.0)
# ────────────────────────────────────────────────────────────
echo "Solidtime: starting full stack to run migrations…"
"${DFWEBOS_ROOT}/scripts/app" compose "${APP_ID}" \
  up -d --wait --wait-timeout 90

# ────────────────────────────────────────────────────────────
# Повторяйте попытку, пока не будет создан пользователь-администратор (максимум 60 секунд).
# Все контейнеры запущены, поэтому с первой попытки все должно получиться.
# Но включение цикла повторов для надежности
# ────────────────────────────────────────────────────────────
echo "Solidtime: ensuring admin user exists…"
for ((try=1; try<=MAX_TRIES; try++)); do
  # Введите пароль + подтверждение в неинтерактивном режиме (две строки, разделенные \n),
  # затем запустите помощник Laravel внутри службы *scheduler*.
  # - `printf … |` предоставляет стандартный ввод, поэтому команда никогда не запрашивает.
  # - `compose … exec -T` отключает распределение TTY по умолчанию, делая стандартный ввод
  # вести себя как обычный канал (требуется для ввода в сценарии).
  # - В случае успеха помощник завершает работу из 0, сообщая включающему циклу, что мы закончили.
  if printf '%s\n%s\n' "${APP_PASSWORD}" "${APP_PASSWORD}" | \
     "${DFWEBOS_ROOT}/scripts/app" compose "${APP_ID}" \
       exec -T scheduler php artisan admin:user:create \
         "${ADMIN_NAME}" "${ADMIN_EMAIL}" \
         --ask-for-password --verify-email ; then
    touch "$ADMIN_SENTINEL"
    echo "Solidtime: admin user ready."
    break
  fi
  echo "  Attempt $try/$MAX_TRIES failed - retrying in ${SLEEP_SECS}s…"
  sleep "$SLEEP_SECS"
done

if [[ ! -f "$ADMIN_SENTINEL" ]]; then
  echo "Solidtime ERROR: could not create admin user after $MAX_TRIES attempts."
  exit 1
fi

# ────────────────────────────────────────────────────────────
# Создайте клиент личного доступа Passport, если он отсутствует.
# ────────────────────────────────────────────────────────────
if ! grep -q "^PASSPORT_PERSONAL_ACCESS_CLIENT_ID=" "$KEYS_FILE" 2>/dev/null; then
  echo "Solidtime: creating Passport personal-access client…"
  "${DFWEBOS_ROOT}/scripts/app" compose "${APP_ID}" \
    run --rm app php artisan passport:client --personal --name="API" |
  awk '/Client ID/      {printf "PASSPORT_PERSONAL_ACCESS_CLIENT_ID=%s\n", $NF}
       /Client secret/ {printf "PASSPORT_PERSONAL_ACCESS_CLIENT_SECRET=%s\n", $NF}' \
  >> "$KEYS_FILE"
  echo "Solidtime: Passport client created."
fi

# ────────────────────────────────────────────────────────────
# Отключите все контейнеры и позвольте DFWebOS запустить их заново.
# ────────────────────────────────────────────────────────────
echo "Solidtime: bootstrap finished - stopping stack for clean start…"
"${DFWEBOS_ROOT}/scripts/app" compose "${APP_ID}" stop
