#!/bin/bash
#
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

#
# Transforms environment variables starting with `prefix` to kebab-cased JVM system properties
#
# "_"           becomes "."
# "camelCased"  becomes "camel-cased"
# "PascalCased" stays   "PascalCased" -> classnames stay untouched
#
# Examples:
# CONFIG_whisk_loadbalancer_invokerBusyThreshold -> -Dwhisk.loadbalancer.invoker-busy-threshold
# CONFIG_akka_remote_netty_tcp_bindPort          -> -Dakka.remote.netty.tcp.bind-port
# CONFIG_whisk_spi_LogStoreProvider              -> -Dwhisk.spi.LogStoreProvider
#

prefix="CONFIG_"
configVariables=$(compgen -v | grep $prefix)

props=()

for var in $configVariables
do
    value=$(printenv "$var")
    #allow us to dereference environment variables, e.g. CONFIG_some_key=$SOME_ENV_VAR
    if [[ $value == \$* ]] # iff the value starts with $
    then
        varname=${value:1} # drop the starting '$'
        value2=${!varname} # '!' dereferences the variable
        if [ ! -z "$value2" ]
        then
            value=$value2 # replace $value with $value2 (the dereferenced value)
        fi
    fi


    if [ ! -z "$value" ]
    then
        sansConfig=${var#$prefix} # remove the CONFIG_ prefix
        parts=${sansConfig//_/ } # "split" the name by replacing '_' with ' '

        transformedParts=()
        for part in $parts
        do
            if [[ $part =~ ^[A-Z] ]] # if the current part starts with an uppercase letter (is PascalCased)
            then
                transformedParts+=($part) # leave it alone
            else
                transformedParts+=($(echo "$part" | sed -r 's/([a-z0-9])([A-Z])/\1-\L\2/g')) # rewrite camelCased to kebab-cased
            fi
        done

        key=$(IFS=.; echo "${transformedParts[*]}") # reassemble the parts delimited by a '.'
        props+=("-D$key='$value'") # assemble a JVM system property
    fi
done

echo "${props[@]}"
