#!/bin/sh
set -ex
cd "$(dirname "$0")"

BASE="${PWD}/../"

# BUILD_IMAGE from environment vairables has precedence
if [ ! -z "${BUILD_IMAGE}" ]
then
  ENV_BUILD_IMAGE="${BUILD_IMAGE}"
fi

if [ -f ".env.default" ]
then
  export $(cat .env.default | sed 's/#.*//g' | xargs)
fi

if [ -f ".env" ]
then
  export $(cat .env | sed 's/#.*//g' | xargs)
fi

# BUILD_IMAGE from environment vairables has precedence
if [ ! -z "${ENV_BUILD_IMAGE}" ]
then
  BUILD_IMAGE="${ENV_BUILD_IMAGE}"
  unset ENV_BUILD_IMAGE
fi

if [ -z "${1}" ] && [ ! -z "${SERVER_TAG}" ]
then
  ./build base
  ./build ${SERVER_TAG}
  exit 0
fi


build_client() {
  docker build -t neko-dev-client -f base/Dockerfile --target client "${BASE}"
  docker run --rm \
    --user "$(id -u):$(id -g)" \
    -v "${BASE}client/dist:/tmp/dist" \
    neko-dev-client sh -c "rm -rf /tmp/dist/*; cp -r /src/dist/* /tmp/dist"
}

build_server() {
  docker build -t neko-dev-server -f base/Dockerfile --target server "${BASE}"
  docker run --rm \
    --user "$(id -u):$(id -g)" \
    -v "${BASE}server/bin:/tmp/bin" \
    neko-dev-server sh -c "rm -rf /tmp/bin/neko; cp /src/bin/neko /tmp/bin"
}

build() {
  if [ "$1" = "base" ]
  then
    # build base
    docker build -t "${BUILD_IMAGE}:base" -f base/Dockerfile "${BASE}"
  else
    # build image
    docker build -t "${BUILD_IMAGE}:$1" --build-arg="BASE_IMAGE=${BUILD_IMAGE}:base" -f "$1/Dockerfile" "$1/"
  fi
}

build_arm() {
  if [ "$1" = "base" ]
  then
    # build ARM base
    docker build -t "${BUILD_IMAGE}:arm-base" -f base/Dockerfile.arm "${BASE}"
  elif [ -f "$1/Dockerfile.arm" ]
  then
    # build dedicated ARM image
    docker build -t "${BUILD_IMAGE}:arm-$1" --build-arg="BASE_IMAGE=${BUILD_IMAGE}:arm-base" -f "$1/Dockerfile.arm" "$1/"
  else
    # try to build ARM image with common Dockerfile
    docker build -t "${BUILD_IMAGE}:arm-$1" --build-arg="BASE_IMAGE=${BUILD_IMAGE}:arm-base" -f "$1/Dockerfile" "$1/"
  fi
}

build_intel() {
  if [ "$1" = "base" ]
  then
    # build intel base
    docker build -t "${BUILD_IMAGE}:intel-base" -f base/Dockerfile.intel "${BASE}"
  elif [ -f "$1/Dockerfile.intel" ]
  then
    # build dedicated intel image
    docker build -t "${BUILD_IMAGE}:intel-$1" --build-arg="BASE_IMAGE=${BUILD_IMAGE}:intel-base" -f "$1/Dockerfile.intel" "$1/"
  else
    # try to build intel image with common Dockerfile
    docker build -t "${BUILD_IMAGE}:intel-$1" --build-arg="BASE_IMAGE=${BUILD_IMAGE}:intel-base" -f "$1/Dockerfile" "$1/"
  fi
}

build_nvidia() {
  if [ "$1" = "base" ]
  then
    # build nvidia base
    docker build -t "${BUILD_IMAGE}:nvidia-base" -f base/Dockerfile.nvidia "${BASE}"
  elif [ -f "$1/Dockerfile.nvidia" ]
  then
    # build dedicated nvidia image
    docker build -t "${BUILD_IMAGE}:nvidia-$1" --build-arg="BASE_IMAGE=${BUILD_IMAGE}:nvidia-base" -f "$1/Dockerfile.nvidia" "$1/"
  else
    # try to build nvidia image with common Dockerfile
    docker build -t "${BUILD_IMAGE}:nvidia-$1" --build-arg="BASE_IMAGE=${BUILD_IMAGE}:nvidia-base" -f "$1/Dockerfile" "$1/"
  fi
}

case $1 in
  client) build_client;;
  server) build_server;;

  # build arm- images
  arm-*) build_arm "${1#arm-}";;

  # build intel- images
  intel-*) build_intel "${1#intel-}";;

  # build nvidia- images
  nvidia-*) build_nvidia "${1#nvidia-}";;

  # build images
  *) build "$1";;
esac