#!/bin/bash
# ============================================================================
# Palworld Config Manager
# Konvertiert Umgebungsvariablen zu PalWorldSettings.ini
# ============================================================================

set -e

# Logging
log_info() { echo "[CONFIG] $*"; }
log_warn() { echo "[CONFIG-WARN] $*"; }
log_error() { echo "[CONFIG-ERROR] $*"; }

# Pfade
SETTINGS_DIR="${SERVER_DIR}/Pal/Saved/Config/WindowsServer"
SETTINGS_FILE="${SETTINGS_DIR}/PalWorldSettings.ini"
DEFAULT_SETTINGS_FILE="${SERVER_DIR}/DefaultPalWorldSettings.ini"

log_info "=========================================="
log_info "Config Manager"
log_info "=========================================="

# ============================================================================
# Verzeichnisse erstellen
# ============================================================================

mkdir -p "${SETTINGS_DIR}"

# ============================================================================
# Default-Config extrahieren (falls vorhanden)
# ============================================================================

if [ -f "${SERVER_DIR}/Pal/Saved/Config/WindowsServer/PalWorldSettings.ini" ]; then
    log_info "Existierende Konfiguration gefunden."
    
    # Backup erstellen
    cp "${SETTINGS_FILE}" "${SETTINGS_FILE}.backup.$(date +%Y%m%d_%H%M%S)" 2>/dev/null || true
fi

# ============================================================================
# PalWorldSettings.ini generieren
# ============================================================================

log_info "Generiere PalWorldSettings.ini..."

# Funktion zum sicheren Holen von ENV-Variablen
get_env() {
    local var_name="$1"
    local default_value="$2"
    local result="${!var_name:-$default_value}"
    echo "$result"
}

# Funktion für Boolean-Konvertierung (True/False)
bool_env() {
    local val=$(get_env "$1" "$2")
    case "${val,,}" in
        "true"|"1"|"yes"|"on") echo "True" ;;
        "false"|"0"|"no"|"off") echo "False" ;;
        *) echo "$val" ;;
    esac
}

# Funktion für Schwierigkeitsgrad
parse_difficulty() {
    local val=$(get_env "$1" "$2")
    case "${val,,}" in
        "none"|"") echo "None" ;;
        "easy") echo "Easy" ;;
        "normal") echo "Normal" ;;
        "hard") echo "Hard" ;;
        *) echo "$val" ;;
    esac
}

# Funktion für Death Penalty
parse_death_penalty() {
    local val=$(get_env "$1" "$2")
    case "${val,,}" in
        "none") echo "None" ;;
        "item") echo "Item" ;;
        "itemandequipment") echo "ItemAndEquipment" ;;
        "all") echo "All" ;;
        *) echo "All" ;;
    esac
}

# ============================================================================
# Optionen zusammenbauen
# ============================================================================

OPTIONS=""

# Server-Grundkonfiguration
OPTIONS="${OPTIONS}Difficulty=$(parse_difficulty 'DIFFICULTY' 'None'),"
OPTIONS="${OPTIONS}DayTimeSpeedRate=$(get_env 'DAYTIME_SPEEDRATE' '1.000000'),"
OPTIONS="${OPTIONS}NightTimeSpeedRate=$(get_env 'NIGHTTIME_SPEEDRATE' '1.000000'),"
OPTIONS="${OPTIONS}ExpRate=$(get_env 'EXP_RATE' '1.000000'),"
OPTIONS="${OPTIONS}PalCaptureRate=$(get_env 'PAL_CAPTURE_RATE' '1.000000'),"
OPTIONS="${OPTIONS}PalSpawnNumRate=$(get_env 'PAL_SPAWN_NUM_RATE' '1.000000'),"
OPTIONS="${OPTIONS}PalDamageRateAttack=$(get_env 'PAL_DAMAGE_RATE_ATTACK' '1.000000'),"
OPTIONS="${OPTIONS}PalDamageRateDefense=$(get_env 'PAL_DAMAGE_RATE_DEFENSE' '1.000000'),"
OPTIONS="${OPTIONS}PlayerDamageRateAttack=$(get_env 'PLAYER_DAMAGE_RATE_ATTACK' '1.000000'),"
OPTIONS="${OPTIONS}PlayerDamageRateDefense=$(get_env 'PLAYER_DAMAGE_RATE_DEFENSE' '1.000000'),"
OPTIONS="${OPTIONS}PlayerStomachDecreaceRate=$(get_env 'PLAYER_STOMACH_DECREASE_RATE' '1.000000'),"
OPTIONS="${OPTIONS}PlayerStaminaDecreaceRate=$(get_env 'PLAYER_STAMINA_DECREASE_RATE' '1.000000'),"
OPTIONS="${OPTIONS}PlayerAutoHPRegeneRate=$(get_env 'PLAYER_AUTO_HP_REGEN_RATE' '1.000000'),"
OPTIONS="${OPTIONS}PlayerAutoHpRegeneRateInSleep=$(get_env 'PLAYER_AUTO_HP_REGEN_RATE_IN_SLEEP' '1.000000'),"
OPTIONS="${OPTIONS}PalStomachDecreaceRate=$(get_env 'PAL_STOMACH_DECREASE_RATE' '1.000000'),"
OPTIONS="${OPTIONS}PalStaminaDecreaceRate=$(get_env 'PAL_STAMINA_DECREASE_RATE' '1.000000'),"
OPTIONS="${OPTIONS}PalAutoHPRegeneRate=$(get_env 'PAL_AUTO_HP_REGEN_RATE' '1.000000'),"
OPTIONS="${OPTIONS}PalAutoHpRegeneRateInSleep=$(get_env 'PAL_AUTO_HP_REGEN_RATE_IN_SLEEP' '1.000000'),"
OPTIONS="${OPTIONS}BuildObjectHpRate=$(get_env 'BUILD_OBJECT_HP_RATE' '1.000000'),"
OPTIONS="${OPTIONS}BuildObjectDamageRate=$(get_env 'BUILD_OBJECT_DAMAGE_RATE' '1.000000'),"
OPTIONS="${OPTIONS}BuildObjectDeteriorationDamageRate=$(get_env 'BUILD_OBJECT_DETERIORATION_DAMAGE_RATE' '1.000000'),"
OPTIONS="${OPTIONS}CollectionDropRate=$(get_env 'COLLECTION_DROP_RATE' '1.000000'),"
OPTIONS="${OPTIONS}CollectionObjectHpRate=$(get_env 'COLLECTION_OBJECT_HP_RATE' '1.000000'),"
OPTIONS="${OPTIONS}CollectionObjectRespawnSpeedRate=$(get_env 'COLLECTION_OBJECT_RESPAWN_SPEED_RATE' '1.000000'),"
OPTIONS="${OPTIONS}EnemyDropItemRate=$(get_env 'ENEMY_DROP_ITEM_RATE' '1.000000'),"
OPTIONS="${OPTIONS}DeathPenalty=$(parse_death_penalty 'DEATH_PENALTY' 'All'),"
OPTIONS="${OPTIONS}EnablePlayerToPlayerDamage=$(bool_env 'ENABLE_PLAYER_TO_PLAYER_DAMAGE' 'False'),"
OPTIONS="${OPTIONS}EnableFriendlyFire=$(bool_env 'ENABLE_FRIENDLY_FIRE' 'False'),"
OPTIONS="${OPTIONS}EnableInvaderEnemy=$(bool_env 'ENABLE_INVADER_ENEMY' 'True'),"
OPTIONS="${OPTIONS}EnablePredatorBossPal=$(bool_env 'ENABLE_PREDATOR_BOSS_PAL' 'True'),"
OPTIONS="${OPTIONS}ActiveUNKO=$(bool_env 'ACTIVE_UNKO' 'False'),"
OPTIONS="${OPTIONS}EnableAimAssistPad=$(bool_env 'ENABLE_AIM_ASSIST_PAD' 'True'),"
OPTIONS="${OPTIONS}EnableAimAssistKeyboard=$(bool_env 'ENABLE_AIM_ASSIST_KEYBOARD' 'False'),"
OPTIONS="${OPTIONS}DropItemMaxNum=$(get_env 'DROP_ITEM_MAX_NUM' '3000'),"
OPTIONS="${OPTIONS}DropItemMaxNum_UNKO=$(get_env 'DROP_ITEM_MAX_NUM_UNKO' '100'),"
OPTIONS="${OPTIONS}BaseCampMaxNum=$(get_env 'BASE_CAMP_MAX_NUM' '128'),"
OPTIONS="${OPTIONS}BaseCampWorkerMaxNum=$(get_env 'BASE_CAMP_WORKER_MAX_NUM' '15'),"
OPTIONS="${OPTIONS}DropItemAliveMaxHours=$(get_env 'DROP_ITEM_ALIVE_MAX_HOURS' '1.000000'),"
OPTIONS="${OPTIONS}AutoResetGuildNoOnlinePlayers=$(bool_env 'AUTO_RESET_GUILD_NO_ONLINE_PLAYERS' 'False'),"
OPTIONS="${OPTIONS}AutoResetGuildTimeNoOnlinePlayers=$(get_env 'AUTO_RESET_GUILD_TIME_NO_ONLINE_PLAYERS' '72.000000'),"
OPTIONS="${OPTIONS}GuildPlayerMaxNum=$(get_env 'GUILD_PLAYER_MAX_NUM' '20'),"
OPTIONS="${OPTIONS}PalEggDefaultHatchingTime=$(get_env 'PAL_EGG_DEFAULT_HATCHING_TIME' '72.000000'),"
OPTIONS="${OPTIONS}WorkSpeedRate=$(get_env 'WORK_SPEED_RATE' '1.000000'),"
OPTIONS="${OPTIONS}AutoSaveSpan=$(get_env 'AUTO_SAVE_SPAN' '30.000000'),"
OPTIONS="${OPTIONS}IsMultiplay=$(bool_env 'ENABLE_MULTIPLAY' 'True'),"
OPTIONS="${OPTIONS}IsPvP=$(bool_env 'ENABLE_PVP' 'False'),"
OPTIONS="${OPTIONS}Hardcore=$(bool_env 'HARDCORE' 'False'),"
OPTIONS="${OPTIONS}PalLost=$(bool_env 'PAL_LOST' 'False'),"
OPTIONS="${OPTIONS}CanPickupOtherGuildDeathPenaltyDrop=$(bool_env 'CAN_PICKUP_OTHER_GUILD_DEATH_PENALTY_DROP' 'False'),"
OPTIONS="${OPTIONS}EnableNonLoginPenalty=$(bool_env 'ENABLE_NON_LOGIN_PENALTY' 'True'),"
OPTIONS="${OPTIONS}EnableFastTravel=$(bool_env 'ENABLE_FAST_TRAVEL' 'True'),"
OPTIONS="${OPTIONS}IsStartLocationSelectByMap=$(bool_env 'IS_START_LOCATION_SELECT_BY_MAP' 'True'),"
OPTIONS="${OPTIONS}ExistPlayerAfterLogout=$(bool_env 'EXIST_PLAYER_AFTER_LOGOUT' 'False'),"
OPTIONS="${OPTIONS}EnableDefenseOtherGuildPlayer=$(bool_env 'ENABLE_DEFENSE_OTHER_GUILD_PLAYER' 'False'),"
OPTIONS="${OPTIONS}InvisibleOtherGuildBaseCampAreaFx=$(bool_env 'INVISIBLE_OTHER_GUILD_BASE_CAMP_AREA_FX' 'False'),"
OPTIONS="${OPTIONS}BuildAreaLimit=$(bool_env 'BUILD_AREA_LIMIT' 'False'),"
OPTIONS="${OPTIONS}ItemWeightRate=$(get_env 'ITEM_WEIGHT_RATE' '1.000000'),"
OPTIONS="${OPTIONS}CoopPlayerMaxNum=$(get_env 'COOP_PLAYER_MAX_NUM' '4'),"
OPTIONS="${OPTIONS}ServerPlayerMaxNum=$(get_env 'MAX_PLAYERS' '32'),"
OPTIONS="${OPTIONS}ServerName=\"${SERVER_NAME}\","
OPTIONS="${OPTIONS}ServerDescription=\"${SERVER_DESCRIPTION}\","
OPTIONS="${OPTIONS}AdminPassword=\"${ADMIN_PASSWORD}\","
OPTIONS="${OPTIONS}ServerPassword=\"${SERVER_PASSWORD}\","
OPTIONS="${OPTIONS}PublicPort=$(get_env 'SERVER_PORT' '8211'),"
OPTIONS="${OPTIONS}PublicIP=\"${PUBLIC_IP:-}\","
OPTIONS="${OPTIONS}RCONEnabled=$(bool_env 'RCON_ENABLED' 'true'),"
OPTIONS="${OPTIONS}RCONPort=$(get_env 'RCON_PORT' '25575'),"
OPTIONS="${OPTIONS}Region=\"${REGION:-}\","
OPTIONS="${OPTIONS}UseAuth=$(bool_env 'USEAUTH' 'True'),"
OPTIONS="${OPTIONS}BanListURL=\"${BAN_LIST_URL:-https://api.palworldgame.com/api/banlist.txt}\","
OPTIONS="${OPTIONS}RESTAPIEnabled=$(bool_env 'REST_API_ENABLED' 'true'),"
OPTIONS="${OPTIONS}RESTAPIPort=$(get_env 'REST_API_PORT' '8212'),"
OPTIONS="${OPTIONS}ShowPlayerList=$(bool_env 'SHOW_PLAYER_LIST' 'True'),"
OPTIONS="${OPTIONS}AllowConnectPlatform=$(get_env 'ALLOW_CONNECT_PLATFORM' 'Steam'),"
OPTIONS="${OPTIONS}IsUseBackupSaveData=$(bool_env 'USE_BACKUP_SAVE_DATA' 'True'),"
OPTIONS="${OPTIONS}LogFormatType=$(get_env 'LOG_FORMAT_TYPE' 'Text'),"
OPTIONS="${OPTIONS}SupplyDropSpan=$(get_env 'SUPPLY_DROP_SPAN' '180'),"

# Entferne letztes Komma
OPTIONS="${OPTIONS%,}"

# ============================================================================
# INI-Datei schreiben
# ============================================================================

cat > "${SETTINGS_FILE}" << EOF
[/Script/Pal.PalGameWorldSettings]
OptionSettings=(${OPTIONS})
EOF

log_info "Konfiguration geschrieben nach: ${SETTINGS_FILE}"

# Berechtigungen setzen
chown ${USER}:${USER} "${SETTINGS_FILE}"
chmod 644 "${SETTINGS_FILE}"

# Ausgabe der generierten Konfiguration (gekürzt)
log_info "Generierte OptionSettings (gekürzt):"
echo "${OPTIONS:0:200}..." | head -1

log_info "Config-Manager abgeschlossen!"
