#!/bin/bash
set -euo pipefail

STANDARD_HOME_DIR="${STANDARD_HOME_DIR:-/home/cmep4i}"
STANDARD_RUN_USER="${STANDARD_RUN_USER:-cmep4i}"
STANDARD_JAVA_HOME="${STANDARD_JAVA_HOME:-${STANDARD_HOME_DIR}/jdk}"

step="${1:-}"
case "${step}" in
    setfraq)
        script="${STANDARD_HOME_DIR}/cpackage/toolsh/setfraq.sh"
        ;;
    setftq)
        script="${STANDARD_HOME_DIR}/cpackage/toolsh/setftq.sh"
        ;;
    settlq)
        script="${STANDARD_HOME_DIR}/cpackage/toolsh/settlq.sh"
        ;;
    setsptp)
        script="${STANDARD_HOME_DIR}/cpackage/toolsh/setsptp.sh"
        ;;
    *)
        echo "unsupported standard vendor step: ${step}" >&2
        exit 64
        ;;
esac

if [ "$(id -u)" != "0" ]; then
    echo "this wrapper must be executed as root through sudo" >&2
    exit 77
fi

if [ ! -f "${script}" ]; then
    echo "standard vendor script not found: ${script}" >&2
    exit 66
fi

read_cpconfig_value() {
    local key="$1"
    local file="${STANDARD_HOME_DIR}/cpconfig.cfg"
    if [ ! -f "${file}" ]; then
        return 0
    fi
    awk -F= -v key="${key}" '
        $1 == key {
            value = substr($0, index($0, "=") + 1)
            gsub(/^[[:space:]]+|[[:space:]]+$/, "", value)
            print value
            exit
        }
    ' "${file}"
}

local_ipv4s() {
    if command -v ip >/dev/null 2>&1; then
        ip -o -4 addr show | awk '{ split($4, parts, "/"); print parts[1] }'
    fi
    if command -v hostname >/dev/null 2>&1; then
        hostname -I 2>/dev/null | tr ' ' '\n' | awk '/^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$/'
    fi
}

has_local_ip() {
    local expected="$1"
    if [ -z "${expected}" ]; then
        return 1
    fi
    local_ipv4s | awk -v expected="${expected}" '$0 == expected { found = 1 } END { exit found ? 0 : 1 }'
}

resolve_standard_node_dir() {
    local node01
    local node02
    node01="$(read_cpconfig_value "sptp_01app_ip")"
    node02="$(read_cpconfig_value "sptp_02app_ip")"
    if has_local_ip "${node02}" && ! has_local_ip "${node01}"; then
        echo "02"
        return 0
    fi
    echo "01"
}

prepare_setsptp_templates() {
    local node_dir
    local cmsp_src
    local cmtp_src
    local cmsp_dst
    local cmtp_dst

    node_dir="$(resolve_standard_node_dir)"
    cmsp_src="${STANDARD_HOME_DIR}/cpackage/cmsp/${node_dir}"
    cmtp_src="${STANDARD_HOME_DIR}/cpackage/cmtp/${node_dir}"
    cmsp_dst="${STANDARD_HOME_DIR}/cmsp"
    cmtp_dst="${STANDARD_HOME_DIR}/cmtp"

    if [ ! -d "${cmsp_src}" ]; then
        echo "standard CMSP template directory not found: ${cmsp_src}" >&2
        exit 67
    fi
    if [ ! -d "${cmtp_src}" ]; then
        echo "standard CMTP template directory not found: ${cmtp_src}" >&2
        exit 67
    fi

    mkdir -p "${cmsp_dst}" "${cmtp_dst}"
    cp -a "${cmsp_src}/." "${cmsp_dst}/"
    cp -a "${cmtp_src}/." "${cmtp_dst}/"
    echo "prepared standard receiver templates from node ${node_dir}"
}

if [ "${step}" = "setsptp" ]; then
    prepare_setsptp_templates
fi

run_payload='
set -euo pipefail
standard_home="$1"
java_home="$2"
script="$3"

cd "${standard_home}"
export JAVA_HOME="${java_home}"
export PATH="${JAVA_HOME}/bin:/usr/local/bin:/usr/bin:/bin:${PATH:-}"

exec /bin/bash "${script}"
'

if command -v runuser >/dev/null 2>&1; then
    exec runuser -u "${STANDARD_RUN_USER}" -- /bin/bash -lc "${run_payload}" -- \
        "${STANDARD_HOME_DIR}" "${STANDARD_JAVA_HOME}" "${script}"
fi

exec sudo -n -u "${STANDARD_RUN_USER}" /bin/bash -lc "${run_payload}" -- \
    "${STANDARD_HOME_DIR}" "${STANDARD_JAVA_HOME}" "${script}"
