#!/usr/bin/env bash

#
#    Copyright (c) 2020 Project CHIP Authors
#
#    Licensed under the Apache License, Version 2.0 (the "License");
#    you may not use this file except in compliance with the License.
#    You may obtain a copy of the License at
#
#        http://www.apache.org/licenses/LICENSE-2.0
#
#    Unless required by applicable law or agreed to in writing, software
#    distributed under the License is distributed on an "AS IS" BASIS,
#    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#    See the License for the specific language governing permissions and
#    limitations under the License.
#

# run.sh   - utility for running a Docker image
#
# This script expects to live in a directory named after the image
#  with a version file next to it.  So: use symlinks
#
here=$(cd "$(dirname "$0")" && pwd)
me=$(basename "$0")

die() {
    echo "$me: *** ERROR: $*"
    exit 1
}

ORG=${DOCKER_RUN_ORG:-connectedhomeip}

# directory name is
IMAGE=${DOCKER_RUN_IMAGE:-$(basename "$here")}

# version
VERSION=${DOCKER_RUN_VERSION:-$(sed 's/ .*//' "$here/version")} ||
    die "please run me from an image directory or set environment variables:
          DOCKER_RUN_ORG
          DOCKER_RUN_IMAGE
          DOCKER_RUN_VERSION"

# full image name
FULL_IMAGE_NAME="$ORG/$IMAGE${VERSION:+:${VERSION}}"

# where
RUN_DIR=${DOCKER_RUN_DIR:-$(pwd)}

help() {
    set +x
    echo "Usage: $me [RUN_OPTIONS -- ] command

  Run a command in a docker image described by $here

  Options:
   --help        get this message

  Any number of 'docker run' options can be passed
     through to the invocation.  Terminate this list of
     options with '--' to begin command and arguments.

  Examples:
    To run bash interactively:
      $ $me -i -- bash
     note the terminating '--' for run options

    To just tell me about the image
      $ $me uname -a

    Add /tmp as an additional volume and run make
      $ $me --volume /tmp:/tmp -- make -C src

"

}

runargs=()

# extract run options
for arg in "$@"; do
    case "$arg" in
        --help)
            help
            exit
            ;;

        --)
            shift
            break
            ;;

        -*)
            runargs+=("$arg")
            shift
            ;;

        *)
            ((!${#runargs[*]})) && break
            runargs+=("$arg")
            shift
            ;;

    esac
done

docker pull "$FULL_IMAGE_NAME" || "$here"/build.sh

docker run "${runargs[@]}" --rm --mount "source=/var/run/docker.sock,target=/var/run/docker.sock,type=bind" -w "$RUN_DIR" -v "$RUN_DIR:$RUN_DIR" "$FULL_IMAGE_NAME" "$@"
