#!/bin/sh

[ -z "$DFB_URL" ] && DFB_URL=https://online.dune-hd.com/dfb

export PATH="$PATH":/sbin:/usr/sbin

Do()
{
    echo "$*" >&2
    "$@" || exit 1
}

CheckCredentials()
{
    if [ "$DFB_CLIENT_ID" = "" ]; then
        echo "Error: DFB_CLIENT_ID env.var must be set" >&2
        exit 1
    fi
    if [ "$DFB_PASSWORD" = "" ]; then
        echo "Error: DFB_PASSWORD env.var must be set" >&2
        exit 1
    fi
}

PrintUsage()
{
    cat <<EOF >&2
Usage: $0 command args...
Commands:
    download {filename}
    unpack_cramfs {tango.cramfs} {dir}
    pack_cramfs {tango.cramfs} {dir}
    prepare_request {dfb_request.zip} {base_dff} {customer_id} {tango.cramfs} {boot_logo.bmp}
    submit_request {dfb_request.zip}
    get_result {dfb_request_id}
    process_request {dfb_request.zip}
    run_request {base_dff} {customer_id} {tango.cramfs} {boot_logo.bmp}
EOF
    exit 1
}

cmd="$1"
shift

case "$cmd" in
    
    download)
        CheckCredentials
        Do wget --http-user="$DFB_CLIENT_ID" --http-password="$DFB_PASSWORD" \
            --no-check-certificate "$DFB_URL/base_fw/$1"
        ;;

    unpack_cramfs)
        [ "$#" = 2 ] || PrintUsage
        Do mkdir -p mnt
        Do mkdir -p "$2"
        Do sudo mount -t cramfs -o ro,loop "$1" mnt
        Do cp -a mnt/* "$2"/
        Do sudo umount mnt
        Do rmdir mnt
        echo "'$1' extracted into '$2' ok" >&2
        ;;

    pack_cramfs)
        [ "$#" = 2 ] || PrintUsage
        Do chmod -R +r "$2"
        Do mkfs.cramfs -b 4096 "$2" "$1"
        echo "'$2' packed into '$1' ok" >&2
        ;;

    prepare_request)
        [ "$#" -ge 3 -a "$#" -le 5 ] || PrintUsage
        Do rm -rf dfb_request
        Do mkdir dfb_request
        Do echo "base_dff = $2" >>dfb_request/dfb_request.txt
        Do echo "customer_id = $3" >>dfb_request/dfb_request.txt
        if [ "$4" != "" ]; then
            Do cp -f "$4" dfb_request/tango.cramfs
            Do echo "tango_cramfs = tango.cramfs" >>dfb_request/dfb_request.txt
        fi
        if [ "$5" != "" ]; then
            Do cp -f "$5" dfb_request/boot_logo.bmp
            Do echo "splash_screen_bmp = boot_logo.bmp" >>dfb_request/dfb_request.txt
        fi
        if [ "$DFB_FW_VERSION" != "" ]; then
            Do echo "fw_version = $DFB_FW_VERSION" >>dfb_request/dfb_request.txt
            Do echo "append_build_no = 0" >>dfb_request/dfb_request.txt
        fi
        if [ "$DFB_REQUEST_EXTRA_DATA" != "" ]; then
          Do echo "$DFB_REQUEST_EXTRA_DATA" >>dfb_request/dfb_request.txt
        fi
        zip="$1"
        file=`basename "$zip"`
        dir=`dirname "$zip"`
        dir=`cd "$dir"; pwd`
        zip="$dir/$file"
        rm -f "$zip"
        Do cd dfb_request
        Do zip -o "$zip" *
        Do cd ..
        echo "DFB request created ok: '$zip'" >&2
        ;;

    submit_request)
        [ "$#" = 1 ] || PrintUsage
        CheckCredentials
        str=`curl -k -L --location-trusted --post301 -F filedata=@"$1" -u "$DFB_CLIENT_ID":"$DFB_PASSWORD" "$DFB_URL/request"` || exit 1
        id=`echo "$str" | sed 's,.*/,,'`
        echo "DFB request submitted ok, id = '$id', DFB_URL = '$DFB_URL'" >&2
        echo "$id"
        ;;

    get_result)
        [ "$#" = 1 ] || PrintUsage
        CheckCredentials
        echo "Checking for result of DFB request with id '$1'..."
        rm -f "error_message.txt"
        while true; do
            wget --http-user="$DFB_CLIENT_ID" --http-password="$DFB_PASSWORD" \
                --content-disposition --no-check-certificate --auth-no-challenge \
                "$DFB_URL/result/$1" 2>/dev/null && break
            echo "Waiting..." >&2
            sleep 5
        done
        if [ -f "error_message.txt" ]; then
            echo "ERROR:" >&2
            cat "error_message.txt" >&2
            exit 1
        fi
        echo "DFB request succeeded ok, resulting .dff.zip downloaded ok" >&2
        ;;

    process_request)
        [ "$#" = 1 ] || PrintUsage
        id=`"$0" submit_request "$1"` || exit 1
        "$0" get_result "$id"
        ;;

    run_request)
        [ "$#" -ge 2 -a "$#" -le 4 ] || PrintUsage
        "$0" prepare_request "dfb_request.zip" "$@" || exit 1
        "$0" process_request "dfb_request.zip"
        ;;

    *)
        PrintUsage
        ;;

esac
