#!/usr/bin/env bash
set -eo pipefail; [[ $DOKKU_TRACE ]] && set -x
source "$PLUGIN_CORE_AVAILABLE_PATH/common/functions"
source "$PLUGIN_AVAILABLE_PATH/config/functions"

dokku_build_cmd() {
  declare desc="build phase"
  local cmd="build"
  local APP="$2"; local IMAGE_SOURCE_TYPE="$3"; local TMP_WORK_DIR="$4"; local IMAGE=$(get_app_image_name "$APP")
  verify_app_name "$APP"

  local CACHE_DIR="$DOKKU_ROOT/$APP/cache"

  eval "$(config_export app "$APP")"
  pushd "$TMP_WORK_DIR" &> /dev/null

  case "$IMAGE_SOURCE_TYPE" in
    herokuish)
      local id=$(tar -c . | docker run "$DOKKU_GLOBAL_RUN_ARGS" -i -a stdin "$DOKKU_IMAGE" /bin/bash -c "mkdir -p /app && tar -xC /app")
      test "$(docker wait "$id")" -eq 0
      docker commit "$id" "$IMAGE" > /dev/null
      [[ -d $CACHE_DIR ]] || mkdir "$CACHE_DIR"
      plugn trigger pre-build-buildpack "$APP"

      local DOCKER_ARGS=$(: | plugn trigger docker-args-build "$APP" "$IMAGE_SOURCE_TYPE")
      [[ "$DOKKU_TRACE" ]] && DOCKER_ARGS+=" -e TRACE=true "
      # shellcheck disable=SC2086
      local id=$(docker run $DOKKU_GLOBAL_RUN_ARGS -d -v $CACHE_DIR:/cache -e CACHE_PATH=/cache $DOCKER_ARGS $IMAGE /build)
      docker attach "$id"
      test "$(docker wait "$id")" -eq 0
      docker commit "$id" "$IMAGE" > /dev/null

      plugn trigger post-build-buildpack "$APP"
      ;;

    dockerfile)
      # extract first port from Dockerfile
      local DOCKERFILE_PORTS=$(get_dockerfile_exposed_ports Dockerfile)
      [[ -n "$DOCKERFILE_PORTS" ]] && config_set --no-restart "$APP" DOKKU_DOCKERFILE_PORTS="$DOCKERFILE_PORTS"

      # extract ENTRYPOINT/CMD from Dockerfile
      local DOCKERFILE_ENTRYPOINT=$(extract_directive_from_dockerfile Dockerfile ENTRYPOINT)
      [[ -n "$DOCKERFILE_ENTRYPOINT" ]] && config_set --no-restart "$APP" DOKKU_DOCKERFILE_ENTRYPOINT="$DOCKERFILE_ENTRYPOINT"
      local DOCKERFILE_CMD=$(extract_directive_from_dockerfile Dockerfile CMD)
      [[ -n "$DOCKERFILE_CMD" ]] && config_set --no-restart "$APP" DOKKU_DOCKERFILE_CMD="$DOCKERFILE_CMD"
      plugn trigger pre-build-dockerfile "$APP"

      [[ "$DOKKU_DOCKERFILE_CACHE_BUILD" == "false" ]] && DOKKU_DOCKER_BUILD_OPTS="$DOKKU_DOCKER_BUILD_OPTS --no-cache"
      local DOCKER_ARGS=$(: | plugn trigger docker-args-build "$APP" "$IMAGE_SOURCE_TYPE")
      # strip --volume and -v args from DOCKER_ARGS
      local DOCKER_ARGS=$(sed -e "s/--volume=[[:graph:]]\+[[:blank:]]\?//g" -e "s/-v[[:blank:]]\?[[:graph:]]\+[[:blank:]]\?//g" <<< "$DOCKER_ARGS")

      # shellcheck disable=SC2086
      docker build $DOCKER_ARGS $DOKKU_DOCKER_BUILD_OPTS -t $IMAGE .

      plugn trigger post-build-dockerfile "$APP"
      ;;

    *)
      dokku_log_fail "Building image source type $IMAGE_SOURCE_TYPE not supported!"
      ;;
  esac
}

dokku_build_cmd "$@"
