#!/usr/bin/env bash
# SPDX-License-Identifier: MIT
if [[ $DEBUG != "" ]]; then
  set +x
fi

# First, collect metadata from git about the current commit
_COMMIT_SHA_LOCAL=$(git rev-parse HEAD)
_BRANCH_NAME_SLUG_LOCAL=$(git rev-parse --abbrev-ref HEAD | tr / -)
TIMESTAMP=$(date -u +"%Y%m%d%H%M%S")

# Then try to get the same info from GitLab CI environment variables, if available
COMMIT_SHA=${CI_COMMIT_SHA:-$_COMMIT_SHA_LOCAL}
BRANCH_NAME_SLUG=${CI_COMMIT_REF_SLUG:-$_BRANCH_NAME_SLUG_LOCAL}
IMAGE_NAME=${IMAGE_NAME:-"$CI_REGISTRY/$CI_PROJECT_PATH"}
KNOT_REPO_URL=${1:-"https://tangled.org/tangled.org/core"}
KNOT_RELEASE_TAG=${2:-"master"} # build from dev branch if release tag left blank
BUILD_TYPE=${BUILD_TYPE:-"production"}
DOCKER_BUILD_REPO=${DOCKER_BUILD_REPO:-"https://tangled.org/recaptime.dev/knot-docker-nest"}
DEPLOY_IMAGE=${DEPLOY_IMAGE:-"alpine:edge"}
BUILDER_IMAGE=${BUILDER_IMAGE:-"golang:1.26-alpine"}

echo "Attempting to build $IMAGE_NAME:build-$TIMESTAMP for $BUILD_TYPE"
DOCKER_BUILDKIT=${DOCKER_BUILDKIT:-1} docker build \
  -t "$IMAGE_NAME:build-$TIMESTAMP" \
  --build-arg KNOT_RELEASE_TAG=$KNOT_RELEASE_TAG \
  --build-arg KNOT_REPO_URL=$KNOT_REPO_URL \
  --build-arg DOCKER_BUILD_REPO=$DOCKER_BUILD_REPO \
  --build-arg DOCKER_BUILD_COMMIT=$COMMIT_SHA \
  --build-arg UID=$UID \
  --build-arg GID=$GID \
  --build-arg DEPLOY_IMAGE=$DEPLOY_IMAGE \
  --build-arg BUILDER_IMAGE=$BUILDER_IMAGE \
  .
  
BUILD_STATUS=$?
if [[ "${BUILD_STATUS}" != "0" ]]; then
  echo "error: Something gone wrong while building the image, see logs above for context."
  exit 1
fi

if [[ $CI == "true" || "$FF_PUSH_LOCAL_BUILDS" == "true" ]]; then
  echo "Tagging $IMAGE_NAME:build-$TIMESTAMP for publishing"
  docker push "$IMAGE_NAME:build-$TIMESTAMP"

  # Do the branch and commit tagging first
  docker tag "$IMAGE_NAME:build-$TIMESTAMP" "$IMAGE_NAME:branch-$BRANCH_NAME_SLUG" && docker push "$IMAGE_NAME:branch-$BRANCH_NAME_SLUG"
  docker tag "$IMAGE_NAME:build-$TIMESTAMP" "$IMAGE_NAME:commit-$COMMIT_SHA" && docker push "$IMAGE_NAME:commit-$COMMIT_SHA"

  # Then the build type tags
  if [[ "$BUILD_TYPE" == "production" ]]; then
    docker tag "$IMAGE_NAME:build-$TIMESTAMP" "$IMAGE_NAME:latest"
    docker push "$IMAGE_NAME:latest"
  else
    docker tag "$IMAGE_NAME:build-$TIMESTAMP" "$IMAGE_NAME:$BUILD_TYPE"
    docker push "$IMAGE_NAME:$BUILD_TYPE"
  fi
else
  echo "Skipping push of $IMAGE_NAME:build-$TIMESTAMP to registry"
fi

if [[ $DEBUG != "" ]]; then
  set -x
fi