#!/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 "hadoop-${VERSION}"
run mkdir "hadoop-${VERSION}"
run cd "hadoop-${VERSION}"
run cp -p "${ROOT}/LICENSE.txt" .
run cp -p "${ROOT}/NOTICE.txt" .
run cp -p "${ROOT}/LICENSE-binary" .
run mkdir licenses-binary
run cp -p "${ROOT}/licenses-binary"/* licenses-binary/
run cp -p "${ROOT}/NOTICE-binary" .
run cp -p "${ROOT}/README.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}" .
run copy "${ROOT}/hadoop-common-project/hadoop-nfs/target/hadoop-nfs-${VERSION}" .
run copy "${ROOT}/hadoop-common-project/hadoop-registry/target/hadoop-registry-${VERSION}" .
run copy "${ROOT}/hadoop-hdfs-project/hadoop-hdfs/target/hadoop-hdfs-${VERSION}" .
run copy "${ROOT}/hadoop-hdfs-project/hadoop-hdfs-nfs/target/hadoop-hdfs-nfs-${VERSION}" .
run copy "${ROOT}/hadoop-hdfs-project/hadoop-hdfs-client/target/hadoop-hdfs-client-${VERSION}" .
run copy "${ROOT}/hadoop-hdfs-project/hadoop-hdfs-native-client/target/hadoop-hdfs-native-client-${VERSION}" .
run copy "${ROOT}/hadoop-hdfs-project/hadoop-hdfs-rbf/target/hadoop-hdfs-rbf-${VERSION}" .
run copy "${ROOT}/hadoop-yarn-project/target/hadoop-yarn-project-${VERSION}" .
run copy "${ROOT}/hadoop-mapreduce-project/target/hadoop-mapreduce-${VERSION}" .

#copy httpfs and kms as is
run cp -pr "${ROOT}/hadoop-hdfs-project/hadoop-hdfs-httpfs/target/hadoop-hdfs-httpfs-${VERSION}"/* .
run cp -pr "${ROOT}/hadoop-common-project/hadoop-kms/target/hadoop-kms-${VERSION}"/* .

# copy client jars as-is
run mkdir -p "share/hadoop/client"
run cp -p "${ROOT}/hadoop-client-modules/hadoop-client-api/target/hadoop-client-api-${VERSION}.jar" share/hadoop/client/
run cp -p "${ROOT}/hadoop-client-modules/hadoop-client-runtime/target/hadoop-client-runtime-${VERSION}.jar" share/hadoop/client/
run cp -p "${ROOT}/hadoop-client-modules/hadoop-client-minicluster/target/hadoop-client-minicluster-${VERSION}.jar" share/hadoop/client/

run copy "${ROOT}/hadoop-tools/hadoop-tools-dist/target/hadoop-tools-dist-${VERSION}" .
run copy "${ROOT}/hadoop-tools/hadoop-dynamometer/hadoop-dynamometer-dist/target/hadoop-dynamometer-dist-${VERSION}" .


echo
echo "Hadoop dist layout available at: ${BASEDIR}/hadoop-${VERSION}"
echo
