#!/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.


# project.version
VERSION=$1

# project.build.directory
BASEDIR=$2

#hdds.version
HDDS_VERSION=$3

function run()
{
  declare res

  echo "\$ ${*}"
  "${@}"
  res=$?
  if [[ ${res} != 0 ]]; then
    echo
    echo "Failed!"
    echo
    exit "${res}"
  fi
}

function findfileindir()
{
  declare file="$1"
  declare dir="${2:-./share}"
  declare count

  count=$(find "${dir}" -iname "${file}" | wc -l)

  #shellcheck disable=SC2086
  echo ${count}
}

function copyifnotexists()
{
  declare src="$1"
  declare dest="$2"

  declare srcname
  declare destdir

  declare child
  declare childpath

  if [[ -f "${src}" ]]; then
    srcname=${src##*/}
    if [[ "${srcname}" != *.jar ||
          $(findfileindir "${srcname}") -eq "0" ]]; then
      destdir=$(dirname "${dest}")
      mkdir -p "${destdir}"
      cp -p "${src}" "${dest}"
    fi
  else
    for childpath in "${src}"/*; do
      child="${childpath##*/}"
      if [[ "${child}" == "doc" ||
            "${child}" == "webapps" ]]; then
        mkdir -p "${dest}/${child}"
        cp -r "${src}/${child}"/* "${dest}/${child}"
        continue;
      fi
      copyifnotexists "${src}/${child}" "${dest}/${child}"
    done
  fi
}

#Copy all contents as is except the lib.
#for libs check for existence in share directory, if not exist then only copy.
function copy()
{
  declare src="$1"
  declare dest="$2"

  declare child
  declare childpath

  if [[ -d "${src}" ]]; then
    for childpath in "${src}"/*; do
      child="${childpath##*/}"

      if [[ "${child}" == "share" ]]; then
        copyifnotexists "${src}/${child}" "${dest}/${child}"
      else
        if [[ -d "${src}/${child}" ]]; then
          mkdir -p "${dest}/${child}"
          cp -pr "${src}/${child}"/* "${dest}/${child}"
        else
          cp -pr "${src}/${child}" "${dest}/${child}"
        fi
      fi
    done
  fi
}

# shellcheck disable=SC2164
ROOT=$(cd "${BASEDIR}"/../..;pwd)
echo
echo "Current directory $(pwd)"
echo
run rm -rf "ozone-${HDDS_VERSION}"
run mkdir "ozone-${HDDS_VERSION}"
run cd "ozone-${HDDS_VERSION}"
run cp -p "${ROOT}/LICENSE.txt" .
run cp -p "${ROOT}/NOTICE.txt" .

# Copy hadoop-common first so that it have always have all dependencies.
# Remaining projects will copy only libraries which are not present already in 'share' directory.
run copy "${ROOT}/hadoop-common-project/hadoop-common/target/hadoop-common-${VERSION}" .


# HDDS
run copy "${ROOT}/hadoop-hdds/common/target/hadoop-hdds-common-${HDDS_VERSION}" .
run copy "${ROOT}/hadoop-hdds/framework/target/hadoop-hdds-server-framework-${HDDS_VERSION}" .
run copy "${ROOT}/hadoop-hdds/server-scm/target/hadoop-hdds-server-scm-${HDDS_VERSION}" .
run copy "${ROOT}/hadoop-hdds/container-service/target/hadoop-hdds-container-service-${HDDS_VERSION}" .
run copy "${ROOT}/hadoop-hdds/client/target/hadoop-hdds-client-${HDDS_VERSION}" .
run copy "${ROOT}/hadoop-hdds/tools/target/hadoop-hdds-tools-${HDDS_VERSION}" .

# Ozone
run copy "${ROOT}/hadoop-ozone/common/target/hadoop-ozone-common-${HDDS_VERSION}" .
run copy "${ROOT}/hadoop-ozone/ozone-manager/target/hadoop-ozone-ozone-manager-${HDDS_VERSION}" .
run copy "${ROOT}/hadoop-ozone/objectstore-service/target/hadoop-ozone-objectstore-service-${HDDS_VERSION}" .
run copy "${ROOT}/hadoop-ozone/client/target/hadoop-ozone-client-${HDDS_VERSION}" .
run copy "${ROOT}/hadoop-ozone/tools/target/hadoop-ozone-tools-${HDDS_VERSION}" .

#shaded ozonefs
mkdir -p "./share/hadoop/ozonefs"
cp "${ROOT}/hadoop-ozone/ozonefs/target/hadoop-ozone-filesystem-${HDDS_VERSION}.jar" "./share/hadoop/ozonefs/hadoop-ozone-filesystem-${HDDS_VERSION}.jar"

#shaded datanode service
mkdir -p "./share/hadoop/ozoneplugin"
cp "${ROOT}/hadoop-ozone/objectstore-service/target/hadoop-ozone-objectstore-service-${HDDS_VERSION}-plugin.jar" "./share/hadoop/ozoneplugin/hadoop-ozone-datanode-plugin-${HDDS_VERSION}.jar"


# Optional documentation, could be missing
cp -r "${ROOT}/hadoop-ozone/docs/target/classes/webapps/docs" ./share/hadoop/ozone/webapps/ozoneManager/
cp -r "${ROOT}/hadoop-ozone/docs/target/classes/webapps/docs" ./share/hadoop/hdds/webapps/scm/
cp -r "${ROOT}/hadoop-ozone/docs/target/classes/webapps/docs" ./


rm sbin/*all.sh
rm sbin/*all.cmd

#remove test and java sources
find . -name "*tests.jar" | xargs rm
find . -name "*sources.jar" | xargs rm
find . -name jdiff -type d | xargs rm -rf

#add ozone specific readme

run cp "${ROOT}/hadoop-dist/src/main/ozone/README.txt" README.txt
#Copy docker compose files and robot tests
run cp -p -r "${ROOT}/hadoop-dist/src/main/compose" .
run cp -p -r "${ROOT}/hadoop-dist/src/main/smoketest" .

mkdir -p ./share/hadoop/mapreduce
mkdir -p ./share/hadoop/yarn
mkdir -p ./share/hadoop/hdfs
echo
echo "Hadoop Ozone dist layout available at: ${BASEDIR}/ozone-${HDDS_VERSION}"
echo
