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

# Этот скрипт адаптирует пароль по умолчанию Stalwart.

APP_DIR="$(readlink -f "$(dirname "${BASH_SOURCE[0]}")/..")"
APP_DATA_DIR="$APP_DIR/data"
CONFIG_FILE="$APP_DATA_DIR/etc/config.toml"

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

# Максимальное количество попыток проверки файла конфигурации
MAX_RETRIES=10
RETRY_DELAY=2

# Проверьте, инициализирован ли уже пароль администратора
check_already_processed() {
    if [ -f "$ADMIN_SENTINEL" ]; then
        echo "Admin already initialized. Skipping..."
        exit 0
    fi
}

# Подождите, пока файл конфигурации станет доступен с повторными попытками.
wait_for_config() {
    local retries=0
    while [ $retries -lt $MAX_RETRIES ]; do
        if [ -f "$CONFIG_FILE" ]; then
            echo "Config file found at $CONFIG_FILE"
            return 0
        fi
        
        retries=$((retries + 1))
        echo "Config file not found. Retry $retries/$MAX_RETRIES in ${RETRY_DELAY}s..."
        sleep $RETRY_DELAY
    done
    
    echo "Error: Config file not found at $CONFIG_FILE after $MAX_RETRIES attempts"
    exit 1
}

# Замените секрет в файле конфигурации
update_secret() {
    if [ -z "${APP_PASSWORD:-}" ]; then
        echo "Error: APP_PASSWORD environment variable not set"
        exit 1
    fi
    
    # Создайте новый секрет, используя ту же соль
    NEW_SECRET=$(openssl passwd -6 -salt 8woP51TKJO.JKOp9 "${APP_PASSWORD}")
    
    # Проверьте, существует ли раздел Fallback-admin.
    if ! grep -q "\[authentication.fallback-admin\]" "$CONFIG_FILE"; then
        echo "Error: [authentication.fallback-admin] section not found in config file"
        exit 1
    fi
    
    # Заменить секретное значение
    sed -i.bak "/^\[authentication\.fallback-admin\]/,/^\[/s|^secret = .*|secret = \"$NEW_SECRET\"|" "$CONFIG_FILE"
    
    # Удалить файл резервной копии
    rm -f "$CONFIG_FILE.bak"
    
    # Создайте дозорный файл, чтобы пометить администратора как инициализированного.
    touch "$ADMIN_SENTINEL"
    
    echo "Successfully updated admin password in $CONFIG_FILE"
    
    echo "Restarting app to apply new password..."
    "${DFWEBOS_ROOT}/scripts/app" restart "${APP_ID}" &
}

# Основное исполнение
echo "Starting Stalwart post-start configuration..."

# Проверьте, обработано ли оно уже
check_already_processed

# Подождите файл конфигурации
wait_for_config

# Обновить секрет
update_secret

echo "Stalwart post-start configuration completed."
