#!/usr/bin/env bash
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you 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.
#
ARCH_X86="x86"
ARCH_AARCH64="aarch64"
ENV_ARCH=$(uname -m)
BUILD_ARCH="aarch64"
POSTFIX="-aarch64"

PLATFORM_AARCH64="--platform linux/arm64/v8"
PLATFORM_X86="--platform linux/amd64"
USE_PLATFORM=""

SHELL_FOLDER=$(cd "$(dirname "$0")";pwd)

cd ${SHELL_FOLDER}
cd ..

USE_BUILDX=""

helpFunc() {
  cat <<EOF
Usage: ./build-arm-docker-images.sh [option]
Options:
  No option              Default build arm images on aarch64 environment.
  -x, --buildx <ARCH>    Use buildx to build docker images for another arch.
  -h, --help             Show help information.
Example:
  Use "./build-arm-docker-images.sh" to build arm images on aarch64 environment.
  Use "./build-arm-docker-images.sh --buildx" to build arm images with buildx.
EOF
}

for (( i=1; i<=$#; i++)); do
  if [ "${!i}" = "-x" ] || [ "${!i}" = "--buildx" ]; then
    NEED_BUILD=true
    USE_BUILDX="buildx"
    j=$((i+1))
    BUILD_ARCH=${!j}
    if [ "$BUILD_ARCH" != "$ARCH_AARCH64" ] && [ "$BUILD_ARCH" != "$ARCH_X86" ]; then
      echo "Wrong arch name: ${BUILD_ARCH}. Please input aarch64 or x86."
      exit 1
    fi
    shift
  elif [ "${!i}" = "-h" ] || [ "${!i}" = "--help" ]; then
    helpFunc
    exit 0
  else
    echo "Wrong param: ${!i}. Please check help information."
    helpFunc
    exit 1
  fi
done

if [ "$BUILD_ARCH" = "$ARCH_X86" ] && [ "$ENV_ARCH" = "$ARCH_X86" ]; then
  mvn --batch-mode --update-snapshots -e -V clean package -DskipTests -Pdocker
  exit 0
fi

version=`awk '/<version>[^<]+<\/version>/{i++}i==2{gsub(/<version>|<\/version>/,"",$1);print $0;exit;}' pom.xml`
tag=${version}-aarch64
if [ "$BUILD_ARCH" = "$ARCH_X86" ]; then
  tag=${version}-x86
  POSTFIX="-x86"
fi

manager_dockerfile_path="inlong-manager/manager-docker/"
agent_dockerfile_path="inlong-agent/agent-docker/"
audit_dockerfile_path="inlong-audit/audit-docker/"
dataproxy_dockerfile_path="inlong-dataproxy/dataproxy-docker/"
tubemq_manager_dockerfile_path="inlong-tubemq/tubemq-docker/tubemq-manager/"
tubemq_all_dockerfile_path="inlong-tubemq/tubemq-docker/tubemq-all/"

manager_tarball_name="apache-inlong-manager-web-${version}-bin.tar.gz"
agent_tarball_name="apache-inlong-agent-${version}-bin.tar.gz"
audit_tarball_name="apache-inlong-audit-${version}-bin.tar.gz"
dataproxy_tarball_name="apache-inlong-dataproxy-${version}-bin.tar.gz"
dashboard_file_name="build"
tubemq_manager_tarball_name="apache-inlong-tubemq-manager-${version}-bin.tar.gz"
tubemq_all_tarball_name="apache-inlong-tubemq-server-${version}-bin.tar.gz"
manager_target_tarball_name="manager-web-${version}-bin.tar.gz"

manager_tarball="inlong-manager/manager-web/target/${manager_tarball_name}"
agent_tarball="inlong-agent/agent-release/target/${agent_tarball_name}"
audit_tarball="inlong-audit/audit-release/target/${audit_tarball_name}"
dataproxy_tarball="inlong-dataproxy/dataproxy-dist/target/${dataproxy_tarball_name}"
tubemq_manager_tarball="inlong-tubemq/tubemq-manager/target/${tubemq_manager_tarball_name}"
tubemq_all_tarball="inlong-tubemq/tubemq-server/target/${tubemq_all_tarball_name}"

DATAPROXY_TARBALL="target/${dataproxy_tarball_name}"
AUDIT_TARBALL="target/${audit_tarball_name}"
TUBEMQ_MANAGER_TARBALL="target/${tubemq_manager_tarball_name}"
DASHBOARD_FILE="${dashboard_file_name}"
AGENT_TARBALL="target/${agent_tarball_name}"
TUBEMQ_TARBALL="target/${tubemq_all_tarball_name}"

cp ${manager_tarball} ${manager_dockerfile_path}/target/${manager_target_tarball_name}
cp inlong-sort/sort-dist/target/sort-dist-${version}.jar ${manager_dockerfile_path}/target/
cp inlong-sort/sort-connectors/pulsar/target/sort-connector-pulsar-${version}.jar ${manager_dockerfile_path}/target/
cp inlong-sort/sort-connectors/jdbc/target/sort-connector-jdbc-${version}.jar ${manager_dockerfile_path}/target/
cp inlong-sort/sort-connectors/hive/target/sort-connector-hive-${version}.jar ${manager_dockerfile_path}/target/
cp ${agent_tarball} ${agent_dockerfile_path}/target/${agent_tarball_name}
cp ${audit_tarball} ${audit_dockerfile_path}/target/${audit_tarball_name}
cp ${dataproxy_tarball} ${dataproxy_dockerfile_path}/target/${dataproxy_tarball_name}
cp ${tubemq_manager_tarball} ${tubemq_manager_dockerfile_path}/target/${tubemq_manager_tarball_name}
if [ "$BUILD_ARCH" = "$ARCH_X86" ]; then
  cp ${tubemq_all_tarball} ${tubemq_all_dockerfile_path}/target/${tubemq_all_tarball_name}
fi

docker ${USE_BUILDX} build ${USE_PLATFORM} -t inlong/manager:${tag}        inlong-manager/manager-docker/      --build-arg VERSION=${version}
docker ${USE_BUILDX} build ${USE_PLATFORM} -t inlong/dataproxy:${tag}      inlong-dataproxy/dataproxy-docker/  --build-arg DATAPROXY_TARBALL=${DATAPROXY_TARBALL}
docker ${USE_BUILDX} build ${USE_PLATFORM} -t inlong/audit:${tag}          inlong-audit/audit-docker/          --build-arg AUDIT_TARBALL=${AUDIT_TARBALL}
docker ${USE_BUILDX} build ${USE_PLATFORM} -t inlong/tubemq-manager:${tag} inlong-tubemq/tubemq-docker/tubemq-manager/ --build-arg TUBEMQ_MANAGER_TARBALL=${TUBEMQ_MANAGER_TARBALL}
docker ${USE_BUILDX} build ${USE_PLATFORM} -t inlong/dashboard:${tag}      inlong-dashboard/                   --build-arg DASHBOARD_FILE=${DASHBOARD_FILE}
docker ${USE_BUILDX} build ${USE_PLATFORM} -t inlong/agent:${tag}          inlong-agent/agent-docker/          --build-arg AGENT_TARBALL=${AGENT_TARBALL}
if [ "$BUILD_ARCH" = "$ARCH_X86" ]; then
  docker ${USE_BUILDX} build ${USE_PLATFORM} -t inlong/tubemq-all:${tag}    inlong-tubemq/tubemq-docker/tubemq-all/ --build-arg TUBEMQ_TARBALL=${TUBEMQ_TARBALL}
  docker ${USE_BUILDX} build ${USE_PLATFORM} -t inlong/tubemq-cpp:${tag}    inlong-tubemq/tubemq-docker/tubemq-cpp/
  docker ${USE_BUILDX} build ${USE_PLATFORM} -t inlong/tubemq-build:${tag}  inlong-tubemq/tubemq-docker/tubemq-build/
fi

docker tag inlong/manager:${tag}         inlong/manager:latest${POSTFIX}
docker tag inlong/dataproxy:${tag}       inlong/dataproxy:latest${POSTFIX}
docker tag inlong/audit:${tag}           inlong/audit:latest${POSTFIX}
docker tag inlong/tubemq-manager:${tag}  inlong/tubemq-manager:latest${POSTFIX}
docker tag inlong/dashboard:${tag}       inlong/dashboard:latest${POSTFIX}
docker tag inlong/agent:${tag}           inlong/agent:latest${POSTFIX}
if [ "$BUILD_ARCH" = "$ARCH_X86" ]; then
  docker tag inlong/tubemq-cpp:${tag}   inlong/tubemq-cpp:latest${POSTFIX}
  docker tag inlong/tubemq-build:${tag} inlong/tubemq-build:latest${POSTFIX}
  docker tag inlong/tubemq-all:${tag}   inlong/tubemq-all:latest${POSTFIX}
fi
