#!/usr/bin/env bash

set -e

SILENT=false
COLOR=true
SCRIPTPATH="$(cd $(dirname ${0}); pwd -P)"

SERVER_ADDR="https://app.emcode-provision.app.docker.rew.to"
TOKEN="Rgg5gzEZuzLfF9hR"

### possible value: alt,script
# CODE_TYPE="script"
# CODE_SECURE=true
### path to store state of code
STATE_PATH="${HOME}/emcode-store"
### absolute path to store code (default: <STATE_PATH>)
CODE_PATH="${STATE_PATH}/code.js"

_query_args="token=${TOKEN}"
_version_filename="version"

init_config() {
    local write_config=false

    if [[ -f ${SCRIPTPATH}/config.txt ]]; then
        source ${SCRIPTPATH}/config.txt
        log "load config \"${SCRIPTPATH}/config.txt\""
    else
        write_config=true
    fi

    # IFS="="
    #
    # for param in $@; do
    #     read -ra key_val <<<${param}
    #     # echo ${key_val[@]}
    #     case ${key_val[0]} in
    #     "--code-path")
    #         CODE_PATH="${key_val[1]}"
    #         write_config=true
    #         ;;
    #     "--code-type")
    #         # CODE_TYPE="${key_val[1]}"
    #         echo ${key_val[@]}
    #         write_config=true
    #         ;;
    #     esac
    # done
    #
    # unset IFS

    if [[ ${write_config} == true ]]; then
        save_config
        log "save config \"${SCRIPTPATH}/config.txt\""
    fi
}

bool_string() {
    if [[ ${1} == true ]]; then
        echo "true"
    else
        echo "false"
    fi
}

save_config() {
cat <<EOF >${SCRIPTPATH}/config.txt
# display settings
SILENT=$(bool_string ${SILENT})
COLOR=$(bool_string ${COLOR})

# code setting
STATE_PATH=${STATE_PATH}
CODE_PATH=${CODE_PATH}
CODE_TYPE=$([[ -z ${CODE_TYPE} ]] && echo "default" || echo "${CODE_TYPE}")
CODE_SECURE=$(bool_string ${CODE_SECURE})
EOF
}

make_query_args() {
    if [[ ! -z ${CODE_TYPE} ]] && [[ ${CODE_TYPE} != "default" ]]; then
        _query_args+="&type=${CODE_TYPE}"
        _version_filename+="_${CODE_TYPE}"
    fi

    if [[ ${CODE_SECURE} == true ]]; then
        _query_args+="&scheme=https"
        _version_filename+="_secure"
    fi

    local version=$(cat ${STATE_PATH}/${_version_filename}.txt 2>/dev/null | tr -d '\n')

    if [[ ! -z ${version} ]]; then
        _query_args+="&ver=${version}"
    fi
}

log() {
    local level="INFO"
    local date_format="[$(date)]"

    if [[ ${SILENT} == true ]]; then
        return
    fi

    if [[ ${COLOR} == true ]]; then
        echo -en "\e[94m${date_format} \e[91m${level} \e[39m"
    else
        echo -n "${date_format} ${level} "
    fi

    echo "$@"
}

extract_version() {
    local begin_comment="<!--"
    local end_comment="-->"

    if [[ ${CODE_TYPE} == "script" ]]; then
        begin_comment="/\*"
        end_comment="\*/"
    fi

    grep -oP "(?<=${begin_comment})[0-9a-f_-]+(?=${end_comment})" <<< ${1}
}

make_home() {
    if [[ ! -d ${STATE_PATH} ]]; then
        mkdir -p ${STATE_PATH}
    fi
}

main() {
    make_query_args

    local url="${SERVER_ADDR}?${_query_args}"

    log "request to server \"${url}\""

    local code=$(curl -s -L ${url})
    local version=$(extract_version "${code}")

    if [[ ! -z ${version} ]]; then
        make_home
        cat <<<${code} >${CODE_PATH}
        echo -n ${version} >${STATE_PATH}/${_version_filename}.txt
        log "code updated to version \"${version}\""
    fi
}

init_config $@
main
# save_config
