#!/bin/bash

readonly progname="${0##*/}"

get_key_in_env() {
    local key_name="${1}"; shift
    local compose_path=${1:-"/etc/docker/xivo"}; shift
    local custom_env_file=${1:-"custom.env"}; shift
    local key_value

    if key_value=$(grep -oP -m 1 "^\s*${key_name}=\K.*" ${compose_path}/${custom_env_file}); then
        echo "${key_value}"
    else
        echo ""
    fi
}

is_key_in_env() {
    local key_name="${1}"; shift
    local compose_path=${1:-"/etc/docker/xivo"}; shift
    local custom_env_file=${1:-"custom.env"}; shift

    grep -q -oP "${key_name}" "${compose_path}/${custom_env_file}"
}

get_usm_backend_token() {
    local usm_backend_url="${1}"; shift
    local xivo_uuid=$(cat /etc/default/xivo | grep -oP 'XIVO_UUID=(.*)$' | tail -n 1 | cut -d '=' -f 2)
    if token=$(curl --silent --fail --connect-timeout 10 --max-time 20 "${usm_backend_url}/usm/token?xivo_uuid=${xivo_uuid}"); then
        echo "${token}"
    else
        echo "error"
    fi
}

add_key_in_env() {
    local key_name="${1}"; shift
    local key_value="${1}"; shift
    local compose_path=${1:-"/etc/docker/xivo"}; shift
    local custom_env_file=${1:-"custom.env"}; shift

    echo "${key_name}=${key_value}" >> "${compose_path}/${custom_env_file}"
}

replace_key_value_in_custom_env() {
    local key_name="${1}"; shift
    local new_key_value="${1}"; shift
    local compose_path=${1:-"/etc/docker/xivo"}; shift
    local custom_env_file=${1:-"custom.env"}; shift

    sed -e "s/${key_name}=.*/${key_name}=${new_key_value}/g" -i "${compose_path}/${custom_env_file}"
}

main() {
    local backend_url
    backend_url=$(get_key_in_env "USM_BACKEND_URL")
    if [ -z "${backend_url}" ]; then
        backend_url=$(get_key_in_env "USM_BACKEND_URL" "/etc/docker/xivo" "factory.env")
    fi

    local new_token
    new_token=$(get_usm_backend_token "${backend_url}")

    if [ "${new_token}" == "error" ] || [ -z "${new_token}" ]; then
        echo "WARN: could not retrieve USM BACKEND TOKEN at ${backend_url}/usm/token. Doing nothing." | logger -t "${progname}"
        exit 0
    fi

    if is_key_in_env "USM_BACKEND_TOKEN"; then
        echo "INFO: replacing USM BACKEND TOKEN with retrieved value at ${backend_url}/usm/token" | logger -t "${progname}"
        replace_key_value_in_custom_env "USM_BACKEND_TOKEN" "${new_token}"
    else
        echo "INFO: adding USM BACKEND TOKEN with retrieved value at ${backend_url}/usm/token" | logger -t "${progname}"
        add_key_in_env "USM_BACKEND_TOKEN" "${new_token}"
    fi

    echo "INFO: recreating usage_collector if needed" | logger -t "${progname}"
    local dcomp_res
    dcomp_res=$(xivo-dcomp up -d usage_collector 2>&1)
    echo "INFO: $dcomp_res" | logger -t "${progname}"
}

main "${@}"
