#!/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-yarn-project/target/hadoop-yarn-project-${VERSION}" .
run copy "${ROOT}/hadoop-mapreduce-project/target/hadoop-mapreduce-${VERSION}" .
run copy "${ROOT}/hadoop-tools/hadoop-tools-dist/target/hadoop-tools-dist-${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}"/* .

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