#!/bin/bash
#-------------------------------------------------------------------------------

#-------------------------------------------------------------------------------
#
# DOCKER_TOOLS_DEBUG= TRUE | FALSE                       # Enable debugging (Default FALSE)
#
# DOCKER_TOOLS_VOLUME= SINGLE | MERGED | SPLITED         # Default: SPLITED
#     SINGLE:  Merged volume mode     + No service suffix
#     MERGED:  Merged volume mode     + Service suffix
#     SPLITED: By service volume mode + No service suffix
#
# DOCKER_TOOLS_EXEPTION_LIBS="module_name:lib_dir_name ..."
#     Example: postgres:pgsq
#
#-------------------------------------------------------------------------------

set -o errexit

if [[ "${DOCKER_TOOLS_DEBUG}" == "TRUE" ]]
then
    set -x
fi

APPL_HOME_DIR="$(dirname "$(dirname "$0")")"
DYNVAR_LIST="APPL_HOME_DIR"
CONFIG_FILE_LIST=""

version="$1"



#-------------------------------------------------------------------------------
function dynvar_export
{
       var=$1
     value=$2

    
    eval export ${var}=\"${value}\"

    DYNVAR_LIST+=" ${var}"
}



#-------------------------------------------------------------------------------
function psfix_cat
{
       prefix=$1
    separator=$2
       suffix=$3

    
    if [[ "${prefix}" == "" ]] || [[ "${suffix}" == "" ]]
    then
        separator=""
    fi
    
    echo "${prefix}${separator}${suffix}"
}



#-------------------------------------------------------------------------------
function module_lib_name_get
{
       module=$1

       for tup in ${DOCKER_TOOLS_EXEPTION_LIBS}
       do
           if [[ "${module}" == "${tup/:*}" ]]
           then
               echo ${tup/*:}
               return
           fi
       done

       echo "${module}"
}



#-------------------------------------------------------------------------------
function docker_service_add
{
    varible_prefix="$1"
    shift

    for var in service_name target_url_prefix target_name target_name_full target_version from_url_prefix from_name from_version module_name module_version port_main_ext port_main_int port_admin_ext port_admin_int user_name_id group_name_id
    do
        eval ${var}=\"${1}\"
        shift
    done
  
    
    # Service variables

    dynvar_export "${varible_prefix}_SERVICE_NAME"       "${service_name}"


    
    # Global Image variables
    
    if [[ "${target_name}" == "-" ]]
    then
        target_name="${service_name}"
    fi
    
    dynvar_export "${varible_prefix}_IMG_NAME"           "${target_name}"
    dynvar_export "${varible_prefix}_IMG_NAME_FULL"      "${target_name_full}"
    dynvar_export "${varible_prefix}_IMG_VERSION"        "${target_version}"
    dynvar_export "${varible_prefix}_IMG_MAINTAINER"     "\${ORG_MAINTAINER}"
    dynvar_export "${varible_prefix}_IMG_URL"            "${target_url_prefix}/${target_name}:${target_version}"

    if [[ "${service_name}" == "${APPL_NAME}" ]]
    then
        dynvar_export "${varible_prefix}_IMG_URL"        "${target_url_prefix}:${target_version}"
        dynvar_export "${varible_prefix}_HOST_NAME"      "$( psfix_cat "${HOST_NAME_PREFIX}" "-" "webapp")"
    else
        dynvar_export "${varible_prefix}_IMG_URL"        "${target_url_prefix}/${target_name}:${target_version}"
        dynvar_export "${varible_prefix}_HOST_NAME"      "$( psfix_cat "${HOST_NAME_PREFIX}" "-" "${service_name}")"
    fi


    # Building variables
    
    if [[ "${module_name}" == "-" ]]
    then
        module_name="${target_name}"
    fi

    if [[ "${target_name_full}" != "-" ]]
    then
        # Build
        
        dynvar_export "${varible_prefix}_MODULE_NAME"    "${module_name}"
        dynvar_export "${varible_prefix}_MODULE_PATH"    "src/${module_name}"
        dynvar_export "${varible_prefix}_MODULE_VERSION" "${module_version}"

        dynvar_export "${varible_prefix}_IMG_FROM_URL"   "${from_url_prefix}/${from_name}:${from_version}"
    fi
    

    # Volume Directories

    if [[  "${APPL_NAME}" != "" ]]
    then
        dynvar_export "${varible_prefix}_CONTEXT_PATH"   "/${APPL_NAME}/${service_name}/"
    else
        DOCKER_TOOLS_VOLUME="SINGLE"
        dynvar_export "${varible_prefix}_CONTEXT_PATH"   "/${service_name}/"
    fi


    if [[ "${DOCKER_TOOLS_VOLUME}" == "" ]]
    then
        DOCKER_TOOLS_VOLUME="SPLITED"
    fi
    
    if [[ "${DOCKER_TOOLS_VOLUME}" != "SPLITED" ]]
    then
        volume_prefix="."
    else
        volume_prefix="./mnt/${service_name}"
    fi

    if [[ "${DOCKER_TOOLS_VOLUME}" != "MERGED" ]]
    then
        volume_suffix_ext=""
    else
        volume_suffix_ext="${service_name}"
    fi

    
    module_lib_name="$( module_lib_name_get "${module_name}")"

    if [[ "${module_lib_name}" != /* ]]
    then
        path_prefix="/var/lib/"
    else
        path_prefix=""
    fi

    
    module_lib_path=${path_prefix}${module_lib_name}

    dynvar_export "${varible_prefix}_LIB_INT"            "${module_lib_path}"
    dynvar_export "${varible_prefix}_LIB_EXT"            "$( psfix_cat "${volume_prefix}${module_lib_path}" "-" "${volume_suffix_ext}")"
    
    
#    dynvar_export "${varible_prefix}_LIB_INT"            "/var/lib/${module_lib_name}"
#    dynvar_export "${varible_prefix}_LIB_EXT"            "$( psfix_cat "${volume_prefix}/var/lib/${module_lib_name}" "-" "${volume_suffix_ext}")"

    dynvar_export "${varible_prefix}_LOG_INIT_INT"       "/var/log/init"
    dynvar_export "${varible_prefix}_LOG_INIT_EXT"       "$( psfix_cat "${volume_prefix}/var/log/init"               "-" "${volume_suffix_ext}")"

    dynvar_export "${varible_prefix}_LOG_SV_INT"         "/var/log/supervisor"
    dynvar_export "${varible_prefix}_LOG_SV_EXT"         "$( psfix_cat "${volume_prefix}/var/log/supervisor"         "-" "${volume_suffix_ext}")"

    dynvar_export "${varible_prefix}_LOG_MAIN_INT"       "/var/log/${module_name}"
    dynvar_export "${varible_prefix}_LOG_MAIN_EXT"       "$( psfix_cat "${volume_prefix}/var/log/${module_name}"     "-" "${volume_suffix_ext}")"

    
    # Ports
    
    if [[ "${port_main_int}" != "-" ]]
    then
        dynvar_export "${varible_prefix}_PORT_MAIN_INT"  "${port_main_int}"
        dynvar_export "${varible_prefix}_PORT_MAIN_EXT"  "\$(( ${port_main_ext} + ${PORT_ENV_OFFSET}))"
    fi
    
    if [[ "${PORT_SV_INT}" != "" ]]
    then
        dynvar_export "${varible_prefix}_PORT_SV_INT"    "${PORT_SV_INT}"
        dynvar_export "${varible_prefix}_PORT_SV_EXT"    "\$(( \${${varible_prefix}_PORT_MAIN_EXT} + ${PORT_SV_OFFSET}))"
    fi
        
    if [[ "${port_admin_int}" != "-" ]]
    then
        dynvar_export "${varible_prefix}_PORT_ADMIN_INT" "${port_admin_int}"
        dynvar_export "${varible_prefix}_PORT_ADMIN_EXT" "\$(( ${port_admin_ext} + ${PORT_ENV_OFFSET}))"        
    fi

    
    # User & Group

    if [[ "${user_name_id}" == "-" ]]
    then
        user_name="-"
        user_id="-"
    else
        if [[ "${user_name_id}" =~ ^[0-9]+$ ]]
        then
            user_name="-"
            user_id="${user_name_id}"
        else
            user_name="${user_name_id}"
            user_id="$( id -u "${user_name}")"
        fi        
    fi
    
    dynvar_export "${varible_prefix}_USER_NAME"          "${user_name}"
    dynvar_export "${varible_prefix}_USER_ID"            "${user_id}"

    
    if [[ "${group_name_id}" == "-" ]]
    then
        group_name="-"
        group_id="-"
    else
        if [[ "${group_name_id}" =~ ^[0-9]+$ ]]
        then
            group_name="-"
            group_id="${group_name_id}"
        else
            group_name="${group_name_id}"
            group_id="$( getent group "${group_name}" | cut -d: -f3)"
        fi        
    fi
    
    dynvar_export "${varible_prefix}_GROUP_NAME"          "${group_name}"
    dynvar_export "${varible_prefix}_GROUP_ID"            "${group_id}"
}



#-------------------------------------------------------------------------------
function docker_service_add-12
{
    varible_prefix="$1"
    shift
    
    for var in NAME NAME_FULL URL_PREFIX IMG_NAME APPL_NAME VERSION_EXT VERSION_INT PORT_MAIN_EXT PORT_MAIN_INT PORT_ADMIN_EXT PORT_ADMIN_INT USER_NAME GROUP_NAME
    do
        dynvar_export "${varible_prefix}_${var}" "$1"
        shift
    done

    
    dynvar_export "${varible_prefix}_LOG_INIT_INT"       "/var/log/init"
    dynvar_export "${varible_prefix}_LOG_INIT_EXT"       "./var/log/init-\${${varible_prefix}_NAME}"
    dynvar_export "${varible_prefix}_LOG_SV_INT"         "/var/log/supervisor"
    dynvar_export "${varible_prefix}_LOG_SV_EXT"         "./var/log/supervisor-\${${varible_prefix}_NAME}"

    if [[ $( eval echo \${${varible_prefix}_APPL_NAME}) != "-" ]]
    then
        dynvar_export "${varible_prefix}_LIB_INT"        "/var/lib/\${${varible_prefix}_APPL_NAME}"
        dynvar_export "${varible_prefix}_LIB_EXT"        "./var/lib/\${${varible_prefix}_APPL_NAME}"
        dynvar_export "${varible_prefix}_LOG_MAIN_INT"   "/var/log/\${${varible_prefix}_APPL_NAME}"
        dynvar_export "${varible_prefix}_LOG_MAIN_EXT"   "./var/log/\${${varible_prefix}_APPL_NAME}"
    fi
    
    if [[ $( eval echo \${${varible_prefix}_IMG_NAME}) != "-" ]]
    then
        # No Build
        
        dynvar_export "${varible_prefix}_IMG_URL"        "\${${varible_prefix}_URL_PREFIX}/\${${varible_prefix}_IMG_NAME}:\${${varible_prefix}_VERSION_EXT}"
    else
        # Build
        
        dynvar_export "${varible_prefix}_IMG_URL"        "\${${varible_prefix}_URL_PREFIX}/\${${varible_prefix}_NAME}:\${${varible_prefix}_VERSION_EXT}"
        
        dynvar_export "${varible_prefix}_MODULE_NAME"    "\${${varible_prefix}_NAME}"    
        dynvar_export "${varible_prefix}_MODULE_PATH"    "src/\${${varible_prefix}_NAME}"
    fi
    
    dynvar_export "${varible_prefix}_CONTAINER_NAME"     "${CONTAINER_NAME_PREFIX}-\${${varible_prefix}_NAME}"
    dynvar_export "${varible_prefix}_HOST"               "\${${varible_prefix}_CONTAINER_NAME}"
    
    dynvar_export "${varible_prefix}_PORT_MAIN_EXT"      "\$(( \${${varible_prefix}_PORT_MAIN_EXT} + ${PORT_ENV_OFFSET}))"
    dynvar_export "${varible_prefix}_PORT_SV_EXT"        "\$(( \${${varible_prefix}_PORT_MAIN_EXT} + ${PORT_SV_OFFSET}))"
    dynvar_export "${varible_prefix}_PORT_SV_INT"        "9001"

    if [[ $( eval echo \${${varible_prefix}_PORT_ADMIN_EXT}) != "-" ]]
    then
        dynvar_export "${varible_prefix}_PORT_ADMIN_EXT" "\$(( \${${varible_prefix}_PORT_ADMIN_EXT} + ${PORT_ENV_OFFSET}))"        
    fi

    if [[ $( eval echo \${${varible_prefix}_USER_NAME}) == "-" ]]
    then
        dynvar_export "${varible_prefix}_USER_ID"        "-"
    else
        if [[ $( eval echo \${${varible_prefix}_USER_NAME}) =~ ^[0-9]+$ ]]
        then
            dynvar_export "${varible_prefix}_USER_ID"    "\${${varible_prefix}_USER_NAME}"
        else
            dynvar_export "${varible_prefix}_USER_ID"    "\$( id -u \${${varible_prefix}_USER_NAME})"
        fi
    fi
    
    if [[ $( eval echo \${${varible_prefix}_GROUP_NAME}) == "-" ]]
    then
        dynvar_export "${varible_prefix}_GROUP_ID"     "-"
    else        
        if [[ $( eval echo \${${varible_prefix}_GROUP_NAME}) =~ ^[0-9]+$ ]]
        then
            dynvar_export "${varible_prefix}_GROUP_ID"     "\${${varible_prefix}_GROUP_NAME}"
        else
            dynvar_export "${varible_prefix}_GROUP_ID"     "\$( getent group \${${varible_prefix}_GROUP_NAME} | cut -d: -f3)"
        fi
    fi

    dynvar_export "${varible_prefix}_CONTEXT_PATH"    "/${APPL_NAME}/\${${varible_prefix}_NAME}/"
    

#    dynvar_export "${varible_prefix}_" "${varible_prefix}_${}"
}



#-------------------------------------------------------------------------------
function docker_config_add
{
    config_file_target="$1"
    config_file_source="$2"


    CONFIG_FILE_LIST+=" ${config_file_target}:${config_file_source}"
}



#-------------------------------------------------------------------------------

. ${APPL_HOME_DIR}/env

#-------------------------------------------------------------------------------

if [[ "${version}" != "" ]]
then
    APPL_VERSION="$1"
fi

#-------------------------------------------------------------------------------



>${APPL_HOME_DIR}/.env

for var in $( ( grep "^ *[a-zA-Z0-9_-]*=" ${APPL_HOME_DIR}/env | sed -e "s/=.*//" -e "s/ *//"; echo ${DYNVAR_LIST} | sed -e 's/ /\n/g') | sort -u)
do
    echo "${var}='${!var}'" >>${APPL_HOME_DIR}/.env
done



for tupple in ${CONFIG_FILE_LIST}
do
    IFS=":"
    set ${tupple}

    config_file_target="$1"
    config_file_source="$2"
    IFS=" "

    
    while read line
    do
        eval echo $(echo ${line} | sed -e 's/"/\\"/g' -e 's/</\\</g' -e 's/>/\\>/g';)
    done <${config_file_source} >${config_file_target}
done