#!/bin/bash

declare -A props

to_property_name() {
  key=$1
  echo ${key:6} | tr _ . | tr [:upper:] [:lower:]
}

pop_value() {
  key=$1
  fallback=$2

  if [ -z ${props[$key]+x} ] ; then
    echo $fallback
  else
    echo ${props[$key]}
  fi
  unset props[$key]
}

#
# This function allows you to encode as KAFKA_* env vars property names that contain characters invalid for env var names
# You can use:
#   KAFKA_LISTENER_NAME_CLIENT_SCRAM__2DSHA__2D256_SASL_JAAS_CONFIG=something
#
# Which will first be converted to:
#   KAFKA_LISTENER_NAME_CLIENT_SCRAM%2DSHA%2D256_SASL_JAAS_CONFIG=something
#
# And then to:
#   KAFKA_LISTENER_NAME_CLIENT_SCRAM-SHA-256_SASL_JAAS_CONFIG=something
#
unescape() {
  if [[ "$1" != "" ]]; then
    echo "$1" | sed -e "s@__@\%@g" -e "s@+@ @g;s@%@\\\\x@g" | xargs -0 printf "%b"
  fi
}

unset IFS
for var in $(compgen -e); do
  if [[ $var == KAFKA_* ]]; then

    case $var in
      KAFKA_DEBUG|KAFKA_OPTS|KAFKA_VERSION|KAFKA_HOME|KAFKA_CHECKSUM|KAFKA_LOG4J_OPTS|KAFKA_HEAP_OPTS|KAFKA_JVM_PERFORMANCE_OPTS|KAFKA_GC_LOG_OPTS|KAFKA_JMX_OPTS) ;;
      *)
        props[$(to_property_name $(unescape $var))]=${!var}
      ;;
    esac
  fi
done

#
# Generate output
#

if [[ "$1" == "--kraft" ]]; then
  #
  # Output kraft version of server.properties
  #
  echo "#"
  echo "# strimzi.properties (kraft)"
  echo "#"

  echo process.roles=`pop_value process.roles broker,controller`
  echo node.id=`pop_value node.id 1`
  echo log.dirs=`pop_value log.dirs /tmp/kraft-combined-logs`

elif [[ "$1" == "" ]]; then
  echo "#"
  echo "# strimzi.properties"
  echo "#"

  echo broker.id=`pop_value broker.id 0`
  echo log.dirs=`pop_value log.dirs /tmp/kafka-logs`
  echo group.initial.rebalance.delay.ms=`pop_value group.initial.rebalance.delay.ms 0`
else
  echo "Unsupported argument: $1"
  exit 1
fi

echo num.network.threads=`pop_value num.network.threads 3`
echo num.io.threads=`pop_value num.io.threads 8`
echo socket.send.buffer.bytes=`pop_value socket.send.buffer.bytes 102400`
echo socket.receive.buffer.bytes=`pop_value socket.receive.buffer.bytes 102400`
echo socket.request.max.bytes=`pop_value socket.request.max.bytes 104857600`
echo num.partitions=`pop_value num.partitions 1`
echo num.recovery.threads.per.data.dir=`pop_value num.recovery.threads.per.data.dir 1`
echo offsets.topic.replication.factor=`pop_value offsets.topic.replication.factor 1`
echo transaction.state.log.replication.factor=`pop_value transaction.state.log.replication.factor 1`
echo transaction.state.log.min.isr=`pop_value transaction.state.log.min.isr 1`
echo log.retention.hours=`pop_value log.retention.hours 168`
echo log.segment.bytes=`pop_value log.segment.bytes 1073741824`
echo log.retention.check.interval.ms=`pop_value log.retention.check.interval.ms 300000`

#
# Add what remains of KAFKA_* env vars
#
for K in "${!props[@]}"
do
  echo $K=`pop_value $K`
done

echo