#!/bin/bash

rootdir=${rootdir:-/mnt/magic/master-deprov-list}

for uniqname in $(cat $1) ; do
    dirname=${rootdir}/$uniqname
    [[ -e $dirname ]] || mkdir -p $dirname
    if [[ -e $dirname/uploaded ]]; then
        echo "$uniqname already uploaded and verified"
        continue
    fi
    (
        flock -n 9 || exit 1
        startts=$(date -Iseconds)
        if [[ ! -e $dirname/verified ]]; then
            echo "Fetching metadata for $uniqname"
            odm user $uniqname list-items > $dirname/metadata.json
            [[ -s $dirname/metadata.json ]] || exit
            if [[ -d $dirname/files ]]; then
                # Remove non-matching files
                odm list $dirname/metadata.json clean-filetree --dest $dirname/files -v 2> $dirname/stderr.${startts}.cleanup
                find $dirname/files -type d -empty -delete
            fi
            try=0
            retval=1
            until [[ $retval -eq 0 ]] || [[ $try -gt 3 ]]; do
                odm list $dirname/metadata.json download --dest $dirname/files -v 2> $dirname/stderr.${startts}.download.$try
                retval=$?
                if [[ $try -eq 0 ]] && [[ $retval -ne 0 ]]; then
                    # The API might have lied about the hashes
                    echo "Re-fetching metadata for $uniqname"
                    odm user $uniqname list-items > $dirname/metadata.json
                fi
                (( try++ ))
            done
            if [[ $retval -eq 0 ]]; then
                echo "Successfully verified $uniqname download"
                touch $dirname/verified
            else
                echo "Failed to download $uniqname"
                exit
            fi
        fi

        echo "Uploading files for $uniqname"
        gdm filetree $dirname/files upload $uniqname -v 2> $dirname/stderr.${startts}.upload
        tail -1 $dirname/stderr.${startts}.upload
        gdm filetree $dirname/files verify $uniqname -v 2>$dirname/stderr.${startts}.verify
        if [[ $? -eq 0 ]]; then
            echo "Successfully verified $uniqname upload"
            touch $dirname/uploaded
        fi
        tail -1 $dirname/stderr.${startts}.verify
    ) 9>>$dirname/lockfile
    if [[ $? -ne 0 ]]; then
        echo "$uniqname already locked"
    fi
done
