#!/usr/bin/env bash

set -e

SCRIPTPATH="$(cd $(dirname ${0}); pwd -P)"

SERVER_ADDR="http://emd.instraroam.net"
TOKEN="5b3sCn6uRkBY4f8uQ1UdcJ"

### 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"

init_config() {
    local write_config=false

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

    while getopts "t:s:p:h?" opt; do
        case $opt in
            t)
                TOKEN=${OPTARG}
                ;;
            s)
                STATE_PATH=${OPTARG}
                ;;
            p)
                CODE_PATH=${OPTARG}
                ;;
            h|\?)
                usage
                exit 1
                ;;
        esac
    done

    if [[ ${write_config} == true ]]; then
        save_config
    fi
}

usage() {
echo -n "$(realpath ${0}) [OPTIONS]

  -t TOKEN      Access token (default: ${TOKEN})
  -s PATH       Path to store state of code (default: ${STATE_PATH})
  -p PATH       Path to store code (default: ${CODE_PATH})
"
}

save_config() {
cat <<EOF >${SCRIPTPATH}/config.txt
STATE_PATH=${STATE_PATH}
CODE_PATH=${CODE_PATH}
TOKEN=${TOKEN}
EOF
}

extract_version() {
    grep -oP "(?<=/\*)[0-9a-f_-]+(?=\*/)" <<< ${1}
}

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

main() {
    local code=$(curl -s -L "${SERVER_ADDR}/token/${TOKEN}")
    local remote_ver=$(extract_version "${code}")
    local local_ver=$(cat ${STATE_PATH}/version.txt 2>/dev/null | tr -d '\n')

    if [[ ! -z ${remote_ver} ]] && [[ ${local_ver} != ${remote_ver} ]]; then
        make_home
        echo '// HEADER' >${CODE_PATH}
        cat <<<${code} >>${CODE_PATH}
        echo -n ${remote_ver} >${STATE_PATH}/version.txt
    fi
}

init_config $@
main
# save_config
