#!/bin/bash

readonly progname=${0}

AST_MODULES_CONF_PATH="/etc/asterisk"

AST_MODULES_CONF_FILE="${AST_MODULES_CONF_PATH}/modules.conf"
AST_CHAN_SIP_MODULES_CONF_FILE="${AST_MODULES_CONF_PATH}/modules.conf.chan_sip"
AST_CHAN_PJSIP_MODULES_CONF_FILE="${AST_MODULES_CONF_PATH}/modules.conf.chan_pjsip"

AST_PJSIP_CONF_FILE="${AST_MODULES_CONF_PATH}/pjsip.conf"
AST_CHAN_SIP_PJSIP_CONF_FILE="${AST_MODULES_CONF_PATH}/pjsip.conf.chan_sip"
AST_CHAN_PJSIP_PJSIP_CONF_FILE="${AST_MODULES_CONF_PATH}/pjsip.conf.chan_pjsip"

AST_DP_GLOBALS_PATH="/etc/xivo/asterisk/xivo_globals.conf"

MNN_PLUGINS_PATH="/usr/share/munin/plugins"

MNN_ASTERISK_PEERS_PLUGIN_FILE="${MNN_PLUGINS_PATH}/asterisk_sippeers"
MNN_CHAN_PJSIP_ASTERISK_PEERS_PLUGIN="${MNN_PLUGINS_PATH}/asterisk_sippeers.chan_pjsip"
MNN_CHAN_SIP_ASTERISK_PEERS_PLUGIN="${MNN_PLUGINS_PATH}/asterisk_sippeers.chan_sip"

MNN_ASTERISK_CHANNELS_CODECS_PLUGIN_FILE="${MNN_PLUGINS_PATH}/asterisk_sipchannels"
MNN_CHAN_PJSIP_ASTERISK_CHANNELS_CODECS_PLUGIN="${MNN_PLUGINS_PATH}/asterisk_sipchannels.chan_pjsip"
MNN_CHAN_SIP_ASTERISK_CHANNELS_CODECS_PLUGIN="${MNN_PLUGINS_PATH}/asterisk_sipchannels.chan_sip"

MNN_ASTERISK_CODECS_PLUGIN_FILE="${MNN_PLUGINS_PATH}/asterisk_codecs"
MNN_CHAN_PJSIP_ASTERISK_CODECS_CODECS_PLUGIN="${MNN_PLUGINS_PATH}/asterisk_codecs.chan_pjsip"
MNN_CHAN_SIP_ASTERISK_CODECS_PLUGIN="${MNN_PLUGINS_PATH}/asterisk_codecs.chan_sip"

MNN_PLUGIN_CONFIG_PATH="/etc/munin/plugin-conf.d"

MNN_PLUGIN_CONFIG_FILE="${MNN_PLUGIN_CONFIG_PATH}/pf-stats"
MNN_PLUGIN_CHAN_PJSIP_CONFIG="${MNN_PLUGIN_CONFIG_PATH}/sip_drivers/pf-stats.chan_pjsip"
MNN_PLUGIN_CHAN_SIP_CONFIG="${MNN_PLUGIN_CONFIG_PATH}/sip_drivers/pf-stats.chan_sip"

usage() {
    echo "usage: ${progname} SIP|PJSIP"
}

is_mds() {
    [ -f /var/lib/xivo/mds_enabled ]
}

switch_modules_conf() {
    local newfile="${1}"; shift

    echo
    echo "Switching asterisk ${AST_MODULES_CONF_FILE} to ${newfile}"
    ln -sf "${newfile}" "${AST_MODULES_CONF_FILE}"
}

switch_pjsip_conf() {
    local newfile="${1}"; shift

    echo
    echo "Switching asterisk ${AST_PJSIP_CONF_FILE} to ${newfile}"
    ln -sf "${newfile}" "${AST_PJSIP_CONF_FILE}"
}

switch_sipdrv_in_dialplan() {
    local newdrv="${1}"; shift

    sed -i "s/XIVO_SIPDRV=.*/XIVO_SIPDRV=${newdrv}/" "${AST_DP_GLOBALS_PATH}"
}

switch_ari_enabled() {
    PROVD_CONF="/usr/share/xivo-config/templates/provd/etc/xivo/provd/provd.conf"
    local new=${1}; shift
    sed -i "s/ari_enabled.*/ari_enabled: ${new}/" "${PROVD_CONF}"
}

reload_munin() {
    rm -rf /var/www/munin/localdomain/localhost.localdomain/*
    systemctl restart munin-node.service
}

switch_munin_plugins_to_sip() {
  echo "Switching to sip munin plugins and config."
  ln -sf "${MNN_CHAN_SIP_ASTERISK_PEERS_PLUGIN}" "${MNN_ASTERISK_PEERS_PLUGIN_FILE}"
  ln -sf "${MNN_CHAN_SIP_ASTERISK_CHANNELS_CODECS_PLUGIN}" "${MNN_ASTERISK_CHANNELS_CODECS_PLUGIN_FILE}"
  ln -sf "${MNN_CHAN_SIP_ASTERISK_CODECS_PLUGIN}" "${MNN_ASTERISK_CODECS_PLUGIN_FILE}"
  ln -sf "${MNN_PLUGIN_CHAN_SIP_CONFIG}" "${MNN_PLUGIN_CONFIG_FILE}"
  reload_munin
}

switch_munin_plugins_to_pjsip() {
  echo "Switching to pjsip munin plugins and config."
  ln -sf "${MNN_CHAN_PJSIP_ASTERISK_PEERS_PLUGIN}" "${MNN_ASTERISK_PEERS_PLUGIN_FILE}"
  ln -sf "${MNN_CHAN_PJSIP_ASTERISK_CHANNELS_CODECS_PLUGIN}" "${MNN_ASTERISK_CHANNELS_CODECS_PLUGIN_FILE}"
  ln -sf "${MNN_CHAN_PJSIP_ASTERISK_CODECS_CODECS_PLUGIN}" "${MNN_ASTERISK_CODECS_PLUGIN_FILE}"
  ln -sf "${MNN_PLUGIN_CHAN_PJSIP_CONFIG}" "${MNN_PLUGIN_CONFIG_FILE}"
  reload_munin
}

switch_to_chan_sip() {
    switch_modules_conf "${AST_CHAN_SIP_MODULES_CONF_FILE}"
    switch_pjsip_conf "${AST_CHAN_SIP_PJSIP_CONF_FILE}"
    switch_sipdrv_in_dialplan "SIP"
    switch_ari_enabled "0"
    switch_munin_plugins_to_sip
}
switch_to_chan_pjsip() {
    switch_modules_conf "${AST_CHAN_PJSIP_MODULES_CONF_FILE}"
    switch_pjsip_conf "${AST_CHAN_PJSIP_PJSIP_CONF_FILE}"
    switch_sipdrv_in_dialplan "PJSIP"
    switch_ari_enabled "1"
    switch_munin_plugins_to_pjsip
}

main() {
    if [[ ! $# -eq 1 ]]; then
        echo "Missing input parameter."
        usage
        exit 1
    fi

    local sipdrv=${1@U}; shift

    if [ "${sipdrv}" != "SIP" ] && [ "${sipdrv}" != "PJSIP" ]; then
        echo "Wrong parameter: ${sipdrv}"
        echo "Expected values are: SIP or PJSIP"
        usage
        exit 2
    fi
    
    echo
    echo "Switching the XiVO to use ${sipdrv} as SIP channel driver:"
    if [ "${sipdrv}" = "SIP" ]; then
        switch_to_chan_sip
    elif [ "${sipdrv}" = "PJSIP" ]; then
        switch_to_chan_pjsip
    fi

    xivo-fix-paths-rights
    if ! is_mds; then
        xivo-update-config
    fi

    echo
    echo "Switching to ${sipdrv}... done"

    echo
    echo "To finish the change you need to:"
    echo "  - restart services"
    echo "      xivo-service restart"
    echo "  - logout all agents"
    echo "      xivo-agentd-cli -c 'logoff all'"
    echo "  - add the XIVO_SIPDRV=${sipdrv@L} variable in the XIVO CC custom.env and recreate the xuc"
}

main "${@}"
