#!/bin/bash

# This script checks ALL services on the server and returns a status for each.

# Return format is simple ENV with the following format:
# SERVICE_NAME_HEALTH=healthy|unhealthy|unknown
# SERVICE_NAME_PORTS=port1,port2,port3

# Get all services on the server
SCRIPT_DIR="$(dirname "$0")"

    # //------------------------------------------------------------------------------------------------
    # // remote paths
    # // DROPSHELL_DIR
    # //   |-- backups
    # //   |-- temp_files
    # //   |-- agent
    # //   |   |-- bb64
    # //   |   |-- (other agent files, including _allservicesstatus.sh)
    # //   |-- services
    # //       |-- service name
    # //           |-- config
    # //               |-- service.env (actual service config)
    # //               |-- .template_info.env
    # //           |-- template
    # //               |-- _default.env
    # //               |-- (script files)
    # //               |-- config
    # //                   |-- service.env (default service config)
    # //                   |-- .template_info.env
    # //                   |-- (other config files for specific server&service)

# Get all services on the server
SERVICES_PATH=$(realpath "${SCRIPT_DIR}/../services/")

CURRENT_OUTPUT=""
CURRENT_EXIT_CODE=0

load_dotenv(){
    local file_path=$1
    if [ -f "${file_path}" ]; then
        source "${file_path}"
    fi
}

_check_required_env_vars_allservicesstatus() {
    local required_vars=("$@")
    for var in "${required_vars[@]}"; do
        if [ -z "${!var}" ]; then
            _die "Required environment variable $var is not set"
        fi
    done
}

function run_command() {
    local service_path=$1
    local command=$2
    local capture_output=${3:-false}  # default to false if not specified

    # check if the command is a file
    if [ ! -f "${service_path}/template/${command}.sh" ]; then
        return;
    fi

    # run the command in a subshell to prevent environment changes
    CURRENT_OUTPUT=$(
        set -a

        load_dotenv "${service_path}/template/_default.env"
        load_dotenv "${service_path}/config/service.env"
        load_dotenv "${service_path}/config/.template_info.env"

        # update the main variables.
        CONFIG_PATH="${service_path}/config"
        SERVICE="${SERVICE_NAME}"

        set +a

        _check_required_env_vars_allservicesstatus "CONFIG_PATH" "SERVER" "SERVICE" "AGENT_PATH" "HOST_NAME" "TEMPLATE"

        if [ "$capture_output" = "true" ]; then
            # Capture and return output
            bash "${service_path}/template/${command}.sh" 2>&1
        else
            # Run silently and return exit code
            bash "${service_path}/template/${command}.sh" > /dev/null 2>&1
        fi
    )
    CURRENT_EXIT_CODE=$?
}

function command_exists() {
    local service_path=$1
    local command=$2
    if [ ! -f "${service_path}/template/${command}.sh" ]; then
        return 1
    fi
    return 0
}



# Get all service names
SERVICE_NAMES=$(ls "${SERVICES_PATH}")

# Iterate over all service names
for SERVICE_NAME in ${SERVICE_NAMES}; do

    SERVICE_PATH=$(realpath "${SERVICES_PATH}/${SERVICE_NAME}")

    #--------------------------------
    # Get the service health
    if ! command_exists "${SERVICE_PATH}" "status"; then
        SERVICE_HEALTH="unknown"
    else
        run_command "${SERVICE_PATH}" "status" "false"
        if [ "${CURRENT_EXIT_CODE}" -eq 0 ]; then
            SERVICE_HEALTH="healthy"
        else
            SERVICE_HEALTH="unhealthy"
        fi
    fi

    #--------------------------------
    # Get the service ports
    if ! command_exists "${SERVICE_PATH}" "ports"; then
        SERVICE_PORTS=""
    else
        run_command "${SERVICE_PATH}" "ports" "true"
        SERVICE_PORTS="${CURRENT_OUTPUT}"
    fi

    #--------------------------------
    # return the health and ports
    echo "${SERVICE_NAME}_HEALTH=${SERVICE_HEALTH}"
    echo "${SERVICE_NAME}_PORTS=${SERVICE_PORTS}"
done