#!/bin/bash

# list/ajout/supprime/ les domaines extérieurs à kaz.bzh

KAZ_ROOT=$(cd "$(dirname $0)"/..; pwd)
. "${KAZ_ROOT}/bin/.commonFunctions.sh"
setKazVars

export PRG="$0"
cd $(dirname $0)

. "${DOCKERS_ENV}"

LETS_DIR="/etc/letsencrypt/$([ "${mode}" == "local" ] && echo "local" || echo "live")"

declare -a availableComposes availableOrga
availableComposes=(${pahekoHost} ${cloudHost} ${dokuwikiHost} ${wordpressHost} ${matterHost} ${castopodHost})
availableOrga=($(sed -e "s/\(.*\)[ \t]*#.*$/\1/" -e "s/^[ \t]*\(.*\)-orga$/\1/" -e "/^$/d" "${KAZ_CONF_DIR}/container-orga.list"))
availableProxyComposes=($(getList "${KAZ_CONF_DIR}/container-proxy.list"))

# no more export in .env
export $(set | grep "domain=")

export CMD=""
export SIMU=""
export CHANGE=""

usage(){
    echo "Usage: ${PRG} list [friend-domain...]"
    echo "       ${PRG} [-n] add orga [${pahekoHost} ${cloudHost} ${dokuwikiHost} ${wordpressHost} ${matterHost} ${castopodHost}] [friend-domain...] "
    echo "       ${PRG} [-n] del [friend-domain...]"
    echo "       ${PRG} -l"
    echo "  -l short list"
    echo "  -renewAll"
    echo "  -h help"
    echo "  -n simulation"
    exit 1
}

export CERT_CFG="${KAZ_CONF_PROXY_DIR}/foreign-certificate"

createCert () {
    (
	fileName="${LETS_DIR}/$1-key.pem"
	#[ -f "${fileName}" ] || return
	# if [ -f "${fileName}" ]; then
	#     fileTime=$(stat --format='%Y' "${fileName}")
	#     current_time=$(date +%s)
	#     if (( "${fileTime}" > ( "${current_time}" - ( 60 * 60 * 24 * 89 ) ) )); then
	# 	exit
	#     fi
	# fi
	printKazMsg "create certificat for $1"
	${SIMU} docker exec -i proxyServ bash -c "/opt/certbot/bin/certbot certonly -n --nginx -d $1"
    )

}

for ARG in $@; do
    case "${ARG}" in
	'-h' | '-help' )
	    usage
	    ;;
	'-n' )
	    shift
	    export SIMU="echo"
	    ;;
	'-renewAll')
	    for i in $("${KAZ_BIN_DIR}/foreign-domain.sh" -l); do
		echo "$i"
		createCert "$i" |grep failed
	    done
	    exit
	    ;;
	'-l')
	    for compose in ${availableComposes[@]} ; do
		grep "server_name" "${KAZ_CONF_PROXY_DIR}/${compose}_kaz_name" | sed -e "s/[ \t]*\([^#]*\)#.*/\1/g" -e "/^$/d" -e "s/.*server_name[ \t]\([^ ;]*\).*/\1/"
	    done
	    exit
	    ;;
	'list'|'add'|'del' )
	    shift
	    CMD="${ARG}"
	    break
	    ;;
	* )
	    usage
	    ;;
    esac
done

if [ -z "${CMD}" ]; then
    echo "Commande missing"
    usage
fi

########################################
badDomaine () {
    [[ -z "$1" ]] && return 0;
    [[ ! "$1" =~ ^[-.a-zA-Z0-9]*$ ]] && return 0;
    return 1
}
badOrga () {
    [[ -z "$1" ]] && return 0;
    [[ ! " ${availableOrga[*]} " =~ " $1 " ]] && return 0
    return 1
}
badCompose () {
    [[ -z "$1" ]] && return 0;
    [[ ! " ${availableComposes[*]} " =~ " $1 " ]] && return 0
    return 1
}

########################################
listServ () {
    for compose in ${availableComposes[@]} ; do
	sed -e "s/[ \t]*\([^#]*\)#.*/\1/g" -e "/^$/d" -e "s/.*server_name[ \t]\([^ ;]*\).*/\1 : ${compose}/" "${KAZ_CONF_PROXY_DIR}/${compose}_kaz_name"
    done
}

listOrgaServ () {
    for compose in ${availableComposes[@]} ; do
	sed -e "s/[ \t]*\([^#]*\)#.*/\1/g" -e "/^$/d" -e "s/\([^ ]*\)[ \t]*\([^ \t;]*\).*/\1 => \2 : ${compose}/" "${KAZ_CONF_PROXY_DIR}/${compose}_kaz_map"
    done
}

########################################
list () {
    previousOrga=$(listOrgaServ)
    previousServ=$(listServ)
    if [ $# -lt 1 ]; then
	[ -n "${previousOrga}" ] && echo "${previousOrga}"
	[ -n "${previousServ}" ] && echo "${previousServ}"
	return
    fi
    for ARG in $@
    do
	orga=$(echo "${previousOrga}" | grep "${ARG}.* =>")
	serv=$(echo "${previousServ}" | grep "${ARG}.* =>")
	[ -n "${orga}" ] && echo "${orga}"
	[ -n "${serv}" ] && echo "${serv}"
    done
}

########################################
add () {
    # $1 : orga
    # $2 : service
    # $3 : friend-domain
    [ $# -lt 3 ] && usage
    badOrga $1 && echo "bad orga: ${RED}$1${NC} not in ${GREEN}${availableOrga[@]}${NC}" && usage
    badCompose $2 && echo "bad compose: ${RED}$2${NC} not in ${GREEN}${availableComposes[@]}${NC}" && usage
    ORGA=$1
    COMPOSE=$2
    shift; shift
    CLOUD_SERVNAME="${ORGA}-${nextcloudServName}"
    CLOUD_CONFIG="${DOCK_VOL}/orga_${ORGA}-cloudConfig/_data/config.php"

    # XXX check compose exist in orga ?
    # /kaz/bin/kazList.sh service enable ${ORGA}
    if [ "${COMPOSE}" = "${cloudHost}" ]; then
	if ! [[ "$(docker ps -f name=${CLOUD_SERVNAME} | grep -w ${CLOUD_SERVNAME})" ]]; then
	    printKazError "${CLOUD_SERVNAME} not running... abort"
	    exit
	fi
    fi

    for FRIEND in $@; do
	badDomaine "${FRIEND}"  && echo "bad domaine: ${RED}${FRIEND}${NC}" && usage
    done

    for FRIEND in $@; do
	createCert "${FRIEND}"
	if [ "${COMPOSE}" = "${cloudHost}" ]; then
	    IDX=$(awk  'BEGIN {flag=0; cpt=0} /trusted_domains/ {flag=1} /)/ {if (flag) {print cpt+1; exit 0}} / => / {if (flag && cpt<$1) cpt=$1}' "${CLOUD_CONFIG}")
	    ${SIMU} docker exec -ti -u 33 "${CLOUD_SERVNAME}" /var/www/html/occ config:system:set trusted_domains "${IDX}" --value="${FRIEND}"
	fi
	
	previousOrga=$(listOrgaServ | grep "${FRIEND}")
	[[ " ${previousOrga}" =~ " ${FRIEND} => ${ORGA} : ${COMPOSE}" ]] && echo "  - already done" && continue
	[[ " ${previousOrga}" =~ " ${FRIEND} " ]] && echo "  - ${YELLOW}${BOLD}$(echo "${previousOrga}" | grep -e "${FRIEND}")${NC} must be deleted before" && return
	if [[ -n "${SIMU}" ]] ; then
	    echo "${FRIEND} ${ORGA}; => ${KAZ_CONF_PROXY_DIR}/${COMPOSE}_kaz_map"
	    cat <<EOF
    => ${KAZ_CONF_PROXY_DIR}/${COMPOSE}_kaz_name
server_name ${FRIEND};
EOF
	else
	    echo "${FRIEND} ${ORGA};" >> "${KAZ_CONF_PROXY_DIR}/${COMPOSE}_kaz_map"
	    cat  >> "${KAZ_CONF_PROXY_DIR}/${COMPOSE}_kaz_name" <<EOF
server_name ${FRIEND};
EOF
	fi
	echo "${PRG}: ${FRIEND} added"
	
	CHANGE="add"
    done
    #(cd "${KAZ_COMP_DIR}/${ORGA}-orga"; docker-compose restart)
}

########################################
del () {
    [ $# -lt 1 ] && usage

    for FRIEND in $@; do
	badDomaine "${FRIEND}"  && echo "bad domaine: ${RED}${FRIEND}${NC}" && usage
	previous=$(listOrgaServ | grep -e "${FRIEND}")
	[[ ! "${previous}" =~ ^${FRIEND} ]] && echo "${FRIEND} not found in ${previous}" && continue
	# XXX if done OK
	for COMPOSE in ${availableComposes[@]} ; do
	    if grep -q -e "^[ \t]*${FRIEND}[ \t]" "${KAZ_CONF_PROXY_DIR}/${COMPOSE}_kaz_map" ; then
		if [ "${COMPOSE}" = "${cloudHost}" ]; then
		    ORGA="$(grep "${FRIEND}" "${KAZ_CONF_PROXY_DIR}/${COMPOSE}_kaz_map" | sed "s/^${FRIEND}\s*\([^;]*\);/\1/")"
		    CLOUD_CONFIG="${DOCK_VOL}/orga_${ORGA}-cloudConfig/_data/config.php"
		    ${SIMU} sed -e "/\d*\s*=>\s*'${FRIEND}'/d" -i "${CLOUD_CONFIG}"
		fi
		${SIMU} sed -e "/^[ \t]*${FRIEND}[ \t]/d" -i "${KAZ_CONF_PROXY_DIR}/${COMPOSE}_kaz_map"
	    fi
	    if grep -q -e "^[ \t]*server_name ${FRIEND};" "${KAZ_CONF_PROXY_DIR}/${COMPOSE}_kaz_name" ; then
		${SIMU} sed -i "${KAZ_CONF_PROXY_DIR}/${COMPOSE}_kaz_name" \
			-e "/^[ \t]*server_name ${FRIEND};/d"
	    fi
	done
	echo "${PRG}: ${FRIEND} deleted"
	CHANGE="del"
    done
}

########################################
${CMD} $@

if [ -n "${CHANGE}" ] ; then
    echo "Reload proxy conf"
	for item in "${availableProxyComposes[@]}"; do
    	${SIMU} ${KAZ_COMP_DIR}/${item}/proxy-gen.sh
    	${SIMU} "${KAZ_COMP_DIR}/proxy/reload.sh"
    done
fi

########################################