#!/bin/bash -x

action=$1
escaped_name=$2
image=`systemd-escape -u $escaped_name`

export Environment="HOME=/unas/lib/docker"

CURL="curl --unix-socket /var/run/docker.sock"
RUN_DIR="/run/unas-docker"
JOB_ID=$(echo -n $image | md5sum | awk '{print $1}')
JOB_DIR="$RUN_DIR/pull/$JOB_ID"
JOB="$JOB_DIR/info"
PROGRESS="$JOB_DIR/progress"

FILE_REGISTRY_DEFAULT=/unas/etc/docker/registry-default
FILE_REGISTRY=/unas/etc/docker/registry.json

REGISTRY=
USERNAME=
PASSWORD=

if [ -f "$JOB" ];then
    tag=`jq -r .tag "$JOB"`
else
    tag=$image
fi

curl_opt(){
    url="http://localhost/images/create?fromImage=$tag"
    post_data="{\"fromImage\":\"$tag\"}"
}

prepare_(){
    if [ ! -d "$JOB_DIR" ];then
        mkdir -p $JOB_DIR
    fi

    # Job info
    info="{\"start\":`date +%s`,\"image\":\"$image\"}"
    echo $info > $JOB

    update_tag

    # Specify registry
    choose_registry
    login_registry

    echo $info | jq -c ".tag=\"$tag\"" > $JOB

    echo Prepared to pull $image
    echo NAS DOCKER PULL TAGNAME: $tag
}

update_tag() {
    if ! echo $tag | grep -q :;then
        tag=$tag:latest
    fi

    tag=$(echo $tag | sed 's#^docker.io/##')
}

choose_registry() {
    parts=`echo $tag | grep -o / | wc -l`

    if [ $parts -gt 1 ];then
        # Already specified registry
        # Skip
        :
    elif echo $tag | grep -Ewq '^sha256:[a-f0-9]{64}$';then
        # sha256 image id
        # Skip
        :
    else
        registry_id=`cat $FILE_REGISTRY_DEFAULT`
        if [ id"$registry_id" == id0 ];then
            # Use default
            # Skip
            :
        else
            registry=`jq "first(.[] | select(.Id == $registry_id))" $FILE_REGISTRY`
            if [[ -z "$registry" ]]; then
              # No matching registry found
              # Skip
              :
            else
                if [ $parts -eq 0 ];then
                    tag=library/$tag
                fi
                REGISTRY=$(echo $registry | jq -r .URL)
                USERNAME=$(echo $registry | jq -r .Username)
                PASSWORD=$(echo $registry | jq -r .Password)
                tag=$REGISTRY/$tag
            fi
        fi
    fi
}

login_registry() {
    if [[ -z "$REGISTRY" ]]; then
        # Use default registry
        # Skip
        :
    else
        if [[ -n "$USERNAME" ]] && [[ -n "$PASSWORD" ]]; then
            docker_config=`realpath ~/.docker/config.json`
            if ! jq ".auth.$REGISTRY" $docker_config > /dev/null; then
                docker login "$REGISTRY" -u "$USERNAME" -p "$PASSWORD"
            fi
        fi
    fi
}

start_(){
    echo Start pulling $image
    curl_opt

    $CURL -d \'$post_data\' $url -o $PROGRESS 2>/dev/null
}

clear_(){
    echo Clear tmp files
    php /unas/sbin/docker/get_size.php $PROGRESS
    rm -rf $JOB_DIR >/dev/null 2>&1 || :
}

case "$action" in
    prepare)
        prepare_
        ;;
    start)
        #prepare_
        start_
        ;;
    clear)
        clear_
        ;;
    *)
        ;;
esac

exit 0
