#!/bin/bash

lowercase() {
    echo "$1" | tr '[:upper:]' '[:lower:]'
}

usage() {
    echo "$0 [build|run] platform"
    echo "$0 coverage"
    echo ""
    echo "Build and/or run a docker image that can build pfs."
    echo "There is a Dockerfile for each supported platform family."
    echo ""
    echo "  build      build docker image for specified platform"
    echo "             will be tagged as pfs:<platform>"
    echo ""
    echo "  run        run an already built image for a specified platform"
    echo ""
    echo "  coverage   build and run coverage, output HTML report to ./coverage/"
    echo ""

    return 2
}

build() {
    if [[ $# -ne 1 ]]; then usage; return $?; fi

    declare -r platform="$(lowercase "$1")"
    declare -r tag="$project:$platform"
    declare -r file="Dockerfile-$platform"

    if [[ ! -f "$file" ]]; then
        echo "Platform probably not supported, cannot find $file"
        return 1
    fi

    docker build \
        --tag "$tag" \
        --file "$file" \
        "$root"
}

run() {
    if [[ $# -ne 1 ]]; then usage; return $?; fi

    declare -r platform="$(lowercase "$1")"
    declare -r tag="$project:$platform"

    docker run --rm --interactive --tty \
        --volume "$root:/$project" \
        "$tag"
}

coverage() {
    if [[ $# -ne 0 ]]; then usage; return $?; fi

    declare -r tag="$project:coverage"
    declare -r file="Dockerfile-coverage"

    docker build \
        --tag "$tag" \
        --file "$file" \
        "$root"

    mkdir -p "$root/coverage"

    docker run --rm \
        --volume "$root:/$project" \
        --volume "$root/coverage:/coverage" \
        "$tag"
}

main() {
    declare -r project="pfs"
    declare -r root="$(git rev-parse --show-toplevel)"

    declare -r action="$1"

    cd "$root/docker"

    case "$action" in
        build)    build    "${@:2}";;
        run)      run      "${@:2}";;
        coverage) coverage "${@:2}";;
        *)        usage; return $?;;
    esac
}

main "$@"
