#!/bin/bash

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

cd "$(dirname $0)"

ALL_STATUS=$(docker ps -a --format "{{.ID}} {{.Names}} {{.Status}}")
SERVICES_CHOICE="$(getAvailableServices | tr "\n" "|")"
SERVICES_CHOICE="${SERVICES_CHOICE%|}"

usage () {
    echo "${RED}${BOLD}" \
	 "Usage: $0 [-h] {compose|orga|service} {available|validate|enable|disable|status} [names]...${NL}" \
	 "  -h help${NL}" \
 	 "  compose {available|validate|enable|disable} : list docker-compose name${NL}" \
	 "  compose status                              : status of docker-compose (default available)${NL}" \
	 "  service {available|validate}                : list services name${NL}" \
	 "  service {enable|disable}                    : list services in orga${NL}" \
	 "  service status                              : status of services in orga${NL}" \
	 "  service {${SERVICES_CHOICE}}${NL}" \
	 "                                              : list of orga enable a service ${NL}" \
	 "  [compose] in${NL}" \
	 "  ${CYAN}$((getAvailableComposes;getAvailableOrgas) | tr "\n" " ")${NC}${NL}"
    exit 1
}

# ========================================
compose_available () {
    echo $*
}

getComposeEnableByProxy () {
    onList=$(
	for type in ${KAZ_CONF_DIR}/container-*.list ; do
	    getList "${type}"
	done)
    local compose
    for compose in ${onList} ; do
	composeFlag="proxy_${compose//-/_}"
	[[ "${!composeFlag}" == "on" ]] && echo ${compose}
    done
}

compose_validate () {
    echo $(
	for type in ${KAZ_CONF_DIR}/container-*.list ; do
	    getList "${type}"
	done | filterInList $*)
}

compose_enable () {
    echo $(getComposeEnableByProxy | filterInList $*)
}

compose_disable () {
    echo $(getAvailableComposes | filterNotInList $(getComposeEnableByProxy) | filterInList $*)
}

compose_status () {
    for compose in $*; do
	cd "${KAZ_COMP_DIR}/${compose}"
	echo "${compose}:"
	for service in $(docker-compose ps --services 2>/dev/null); do
	    id=$(docker-compose ps -q "${service}" | cut -c 1-12)
	    if [ -z "${id}" ]; then
    		echo "  - ${RED}${BOLD}[Down]${NC} ${service}"
	    else
		status=$(grep "^${id}\b" <<< "${ALL_STATUS}" | sed "s/.*${id}\s\s*\S*\s\s*\(\S*.*\)/\1/")
		COLOR=$([[ "${status}" =~ Up ]] && echo "${GREEN}" || echo "${RED}")
		echo "  - ${COLOR}${BOLD}[${status}]${NC} ${service}"
	    fi
	done
    done
}

# ========================================
service_available () {
    echo $(getAvailableServices)
}

service_validate () {
    echo $(getAvailableServices)
}

getServiceInOrga () {
    for orga in $*; do
	[[ "${orga}" = *"-orga" ]] || continue
	local ORGA_DIR="${KAZ_COMP_DIR}/${orga}"
	ORGA_COMPOSE="${ORGA_DIR}/docker-compose.yml"
	[[ -f "${ORGA_COMPOSE}" ]] || continue
	for service in $(getAvailableServices); do
	    case "${service}" in
		paheko)
		    [ -f "${ORGA_DIR}/usePaheko" ] && echo "${service}"
		    ;;
		wiki)
		    grep -q "\s*dokuwiki:" "${ORGA_COMPOSE}" 2>/dev/null && echo "${service}"
		    ;;
		wp)
		    grep -q "\s*wordpress:" "${ORGA_COMPOSE}" 2>/dev/null && echo "${service}"
		    ;;
		*)
		    grep -q "\s*${service}:" "${ORGA_COMPOSE}" 2>/dev/null && echo "${service}"
	    esac
	done
    done
}

getOrgaWithService() {
    service="$1"
    shift
    case "${service}" in
	wiki) keyword="dokuwiki" ;;
	wp) keyword="wordpress" ;;
	*) keyword="${service}" ;;
    esac
    for orga in $*; do
	[[ "${orga}" = *"-orga" ]] || continue
	local ORGA_DIR="${KAZ_COMP_DIR}/${orga}"
	ORGA_COMPOSE="${ORGA_DIR}/docker-compose.yml"
	[[ -f "${ORGA_COMPOSE}" ]] || continue
	if [ "${service}" = "paheko" ]; then
	    [ -f "${ORGA_DIR}/usePaheko" ] && echo "${orga}"
	else
	    grep -q "\s*${keyword}:" "${ORGA_COMPOSE}" 2>/dev/null && echo "${orga}"
	fi
    done
}

service_enable () {
    echo $(getServiceInOrga $* | sort -u)
}

service_disable () {
    echo $(getAvailableServices | filterNotInList $(getServiceInOrga $*))
}

service_status () {
    # ps per enable
    echo "*** TODO ***"
}

# ========================================

KAZ_CMD=""
case "$1" in
    '-h' | '-help' )
	usage
	;;
    compose|service)
	KAZ_CMD="$1"
	shift
	;;
    *)
	usage
	;;
esac

KAZ_OPT=""
case "$1" in
    available|validate|enable|disable|status)
	KAZ_OPT="$1"
	shift
	;;
    *)
	if [ "${KAZ_CMD}" = "service" ] && [[ $1 =~ ^(${SERVICES_CHOICE})$ ]]; then
	    KAZ_OPT="$1"
	    shift
	    getOrgaWithService "${KAZ_OPT}" $(filterAvailableComposes $*)
	    exit
	fi
	usage
	;;
esac

${KAZ_CMD}_${KAZ_OPT} $(filterAvailableComposes $*)