#!/bin/sh
set -e

CONF_DIR=/home/comtex/asterisk-voip/config
NGINX_CONF=/etc/nginx/sites-enabled/fusion.conf

resolve_public_host() {
    if [ -f /etc/fusion-asterisk/public-host ]; then
        head -n 1 /etc/fusion-asterisk/public-host | tr -d '[:space:]'
        return 0
    fi

    CERT=""
    if [ -f "$NGINX_CONF" ]; then
        CERT=$(awk '/listen[[:space:]]+443/,/ssl_certificate[[:space:]]/ { if ($1 == "ssl_certificate") { gsub(/;/, "", $2); print $2; exit } }' "$NGINX_CONF")
    fi
    SANS=""
    if [ -n "$CERT" ] && [ -f "$CERT" ]; then
        SANS=$(openssl x509 -in "$CERT" -noout -ext subjectAltName 2>/dev/null | tr ',' '\n' | sed -n 's/^[[:space:]]*DNS://p' | tr -d ' ')
    fi
    BASES=$(printf '%s\n' "$SANS" | sed -n 's/^\*\.\(.*\)/\1/p')

    is_base_domain() {
        printf '%s\n' "$BASES" | grep -qx "$1"
    }

    if [ -f "$NGINX_CONF" ]; then
        NAME=$(awk '
            $1 == "server_name" {
                for (i = 2; i <= NF; i++) {
                    gsub(/;/, "", $i)
                    if ($i != "_" && $i ~ /\./) { print $i; exit }
                }
            }
        ' "$NGINX_CONF")
        if [ -n "$NAME" ] && ! is_base_domain "$NAME"; then
            printf '%s\n' "$NAME"
            return 0
        fi
    fi

    EXACT=$(printf '%s\n' "$SANS" | awk 'NF && $0 !~ /^\*/ && index($0, ".") { print }')
    KEPT=""
    N=0
    for NAME in $EXACT; do
        if ! is_base_domain "$NAME"; then
            KEPT=$NAME
            N=$((N + 1))
        fi
    done
    if [ "$N" -eq 1 ]; then
        printf '%s\n' "$KEPT"
    fi
}

reload_or_restart() {
    i=1
    while [ "$i" -le 30 ]; do
        if docker ps --format '{{.Names}}' 2>/dev/null | grep -qx fusion-asterisk \
            && docker exec fusion-asterisk asterisk -rx "module reload res_pjsip.so" >/dev/null 2>&1; then
            return 0
        fi
        sleep 2
        i=$((i + 1))
    done

    if systemctl cat fusion-asterisk.service >/dev/null 2>&1; then
        systemctl restart fusion-asterisk.service
        return 0
    fi

    echo "fusion-asterisk-reconfigure: Asterisk no acepto el reload" >&2
    return 1
}

if [ ! -f "$CONF_DIR/pjsip.conf.in" ]; then
    echo "fusion-asterisk-reconfigure: no esta instalado fusion-asterisk" >&2
    exit 1
fi

EXTERNAL_IP=$(ip -4 route get 1.1.1.1 2>/dev/null | awk '{for (i = 1; i <= NF; i++) if ($i == "src") { print $(i + 1); exit }}')
if [ -z "$EXTERNAL_IP" ]; then
    echo "fusion-asterisk-reconfigure: no pude detectar la IP del servidor" >&2
    exit 1
fi

sed "s/__EXTERNAL_IP__/${EXTERNAL_IP}/g" "$CONF_DIR/pjsip.conf.in" > "$CONF_DIR/pjsip.conf"
if id comtex >/dev/null 2>&1; then
    chown -R comtex:comtex /home/comtex/asterisk-voip
fi

reload_or_restart

PUBLIC_HOST=$(resolve_public_host)
if [ -z "$PUBLIC_HOST" ]; then
    PUBLIC_HOST='[HOST]'
fi

echo ""
echo "wss://${PUBLIC_HOST}:443/asterisk/ws"
echo ""
exit 0
