#!/usr/bin/env bash

function usage {
    cat <<-END >&2
    USAGE: $0
        -k KARAF_SERVICE_PATH       # Karaf installation path (required)
        -j KARAF_SERVICE_JAVA_HOME  # Karaf java home (required)
        -d KARAF_SERVICE_DATA       # Karaf data path (default to \${KARAF_SERVICE_PATH}/data)
        -t KARAF_SERVICE_ETC        # Karaf etc path (default to \${KARAF_SERVICE_PATH}/etc)
        -p KARAF_SERVICE_PIDFILE    # Karaf pid path (default to \${KARAF_SERVICE_DATA}/\${KARAF_SERVICE_NAME}.pid)
        -n KARAF_SERVICE_NAME       # Karaf service name (default karaf)
        -u KARAF_SERVICE_USER       # Karaf user (defaut bpc)
        -g KARAF_SERVICE_GROUP      # Karaf group (default bpc)
        -l KARAF_SERVICE_LOG        # Karaf console log (default to \${KARAF_SERVICE_DATA}/log/\${KARAF_SERVICE_NAME}-console.log)
        -a KARAF_SERVICE_AFTER      # Karaf should start after this service (default to opensearch.service)
        -e KARAF_ENV                # Karaf environment variable (can be repeated)
        -h                          # this usage message
END
    exit
}

KARAF_ENV=()

while getopts k:j:d:t:p:n:e:u:g:l:a:h opt
do
    case $opt in
    k)  export KARAF_SERVICE_PATH="$OPTARG" ;;
    j)  export KARAF_SERVICE_JAVA_HOME="$OPTARG" ;;
    d)  export KARAF_SERVICE_DATA="$OPTARG" ;;
    t)  export KARAF_SERVICE_ETC="$OPTARG" ;;
    p)  export KARAF_SERVICE_PIDFILE="$OPTARG" ;;
    n)  export KARAF_SERVICE_NAME="$OPTARG" ;;
    u)  export KARAF_SERVICE_USER="$OPTARG" ;;
    g)  export KARAF_SERVICE_GROUP="$OPTARG" ;;
    l)  export KARAF_SERVICE_LOG="$OPTARG" ;;
    a)  export KARAF_SERVICE_AFTER="$OPTARG" ;;
    e)  KARAF_ENV+=("$OPTARG") ;;
    h|?) usage ;;
    esac
done

shift $(( $OPTIND - 1 ))

if [[ ! $KARAF_SERVICE_PATH ]]; then
    echo "Warning, KARAF_SERVICE_PATH is required"
    usage
fi

if [[ ! $KARAF_SERVICE_JAVA_HOME ]]; then
    echo "Warning, KARAF_SERVICE_JAVA_HOME is required"
    usage
fi

if [[ ! $KARAF_SERVICE_DATA ]]; then
    export KARAF_SERVICE_DATA="${KARAF_SERVICE_PATH}/data"
fi

if [[ ! $KARAF_SERVICE_ETC ]]; then
    export KARAF_SERVICE_ETC="${KARAF_SERVICE_PATH}/etc"
fi

if [[ ! $KARAF_SERVICE_NAME ]]; then
    export KARAF_SERVICE_NAME="karaf"
fi

if [[ ! $KARAF_SERVICE_PIDFILE ]]; then
    export KARAF_SERVICE_PIDFILE="${KARAF_SERVICE_DATA}/${KARAF_SERVICE_NAME}.pid"
fi

if [[ ! $KARAF_SERVICE_LOG ]]; then
    export KARAF_SERVICE_LOG="${KARAF_SERVICE_DATA}/log/${KARAF_SERVICE_NAME}-console.log"
fi

if [[ ! $KARAF_SERVICE_USER ]]; then
    export KARAF_SERVICE_USER="bpc"
fi

if [[ ! $KARAF_SERVICE_GROUP ]]; then
    export KARAF_SERVICE_GROUP="bpc"
fi

if [[ ! $KARAF_SERVICE_AFTER ]]; then
    export KARAF_SERVICE_AFTER="opensearch.service"
fi

if [[ ! $KARAF_SERVICE_EXECUTABLE ]]; then
    export KARAF_SERVICE_EXECUTABLE="karaf"
fi

systemd_result_file="${KARAF_SERVICE_NAME}.service"

echo "Writing service file: ${systemd_result_file}"
perl -p -e 's/\$\{([^}]+)\}/defined $ENV{$1} ? $ENV{$1} : $&/eg' < "${PWD}/karaf-systemd.template" > "${PWD}/${systemd_result_file}"
