#!/bin/sh

cachedir="/var/cache/alterator/deploy"
po_domain="alterator-deploy"
alterator_api_version=1

. alterator-sh-functions

clear_cache() {
    rm -rf "${cachedir:?}"
    mkdir -p "${cachedir:?}"
}

available_parameters() {
    deploy --parameters "$1" |
    while read -r parameter_pair; do
        parameter="$(echo "$parameter_pair" | sed -E 's/^([^=]+)=.*/\1/')"
        value="$(echo "$parameter_pair" | sed -E 's/^[^=]+=//')"
        echo "$parameter" "$value"
    done
}

available_roles() {
    deploy
}

read_status() {
    if [ -f "${cachedir:?}/.status" ]; then
        cat "${cachedir:?}/.status"
    else
        echo Prepare
    fi
}

get_parameter_default() {
    role="$1"
    parameter="$2"

    available_parameters "$role" |
    while read -r read_parameter read_value; do
        if [ "$read_parameter" = "$parameter" ]; then
            echo "$read_value"
        fi
    done
}

get_parameter() {
    role="$1"
    parameter="$2"

    cat "${cachedir:?}/$role/$parameter"
}

get_all_parameters() {
    role="$1"

    if [ -d "${cachedir:?}/$role" ]; then
        for parameter in "${cachedir:?}/$role"/*; do
            echo "$(basename "$parameter")=$(cat "$parameter")"
        done
    fi
}

set_parameter() {
    role="$1"
    parameter="$2"
    value="$3"

    mkdir -p "${cachedir:?}/$role"
    echo "$value" > "${cachedir:?}/$role/$parameter"
}

reset_parameter() {
    role="$1"
    parameter="$2"

    rm -f "${cachedir:?}/$role/$parameter"
}

reset_all_parameters() {
    role="$1"

    rm -rf "${cachedir:?}/$role"
}

deploy_role() {
    role="$1"

    deploy "$role" $(get_all_parameters "$role")
    rc="$?"
    if [ "$rc" -eq 0 ]; then
        echo Success > "${cachedir:?}/.status"
    else
        echo Error > "${cachedir:?}/.status"
    fi
}

on_message() {
  case "$in_action" in
    read)
        case "${in__objects##*/}" in
            status)
                write_string_param status "$(read_status)"
                ;;
            *)
                write_string_param \
                    value \
                    "$(get_parameter_default "${in_role:?}" "${in_parameter:?}")"
                ;;
        esac ;;
    write)
        case "${in__objects##*/}" in
            set)
                echo "Role: ${in_role:?}" >> /tmp/out
                echo "Parameter: ${in_parameter:?}" >> /tmp/out
                echo "Value: ${in_value:?}" >> /tmp/out
                set_parameter "${in_role:?}" "${in_parameter:?}" "${in_value?}"
                ;;
            reset)
                reset_parameter "${in_role:?}" "${in_parameter:?}"
                ;;
            reset_all)
                reset_all_parameters "${in_role:?}"
                ;;
            *)
                deploy_role "${in_role:?}"
                reset_all_parameters "${in_role:?}"
                ;;
        esac ;;
    list)
        case "${in__objects##*/}" in
            parameters)
                available_parameters "${in_role:?}" |
                while read -r parameter value; do
                    if [ -f "${cachedir:?}/$role/$parameter" ]; then
                        value="$(cat "${cachedir:?}/$role/$parameter")"
                    fi
                    write_enum_item "$parameter=$value"
                    # write_table_item parameter "$parameter" value "$value"
                done
                ;;
            *) available_roles | write_enum ;;
        esac
  esac
}

clear_cache

message_loop
