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

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}/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-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}" .


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