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

lib_dir=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
maven_prefix=https://repo1.maven.org/maven2

function download {
  IFS=':' read -ra DEP <<< "$1"
  dir=$lib_dir/
  if [ -n "$2" ]; then
    dir=$lib_dir/$2
    if [ ! -d $dir ]; then
      mkdir $dir
    fi
  fi
  group=${DEP[0]}
  artifact=${DEP[1]}
  ftype=${DEP[2]}
  version=${DEP[3]}
  fn=$artifact-$version.$ftype
  path="${group//.//}/$artifact/$version/$fn"
  download_url=$maven_prefix/$path

  if [ -f $dir/$fn ]; then
    echo "SUCCESS: Dependency exists - $dir/$fn"
  else
    wget -q $download_url -P $dir
    if [ $? == 0 ]; then
      echo "SUCCESS: Dependency downloaded from $download_url"
    else
      echo "ERROR: Dependency download failed - $download_url"
    fi
  fi
}

case "$1" in
ahz)
  echo "Fetching Hadoop, Accumulo, & Zookeeper dependencies"
  cd $lib_dir/ahz
  rm -f *.jar
  mvn clean package ${*:2}
  ;;
extra)
  echo "Fetching extra Fluo dependencies"
  download aopalliance:aopalliance:jar:1.0
  download com.beust:jcommander:jar:1.72
  download com.google.code.gson:gson:jar:2.8.5
  download com.google.guava:guava:jar:27.0-jre
  download com.google.inject:guice:jar:4.2.2
  download org.apache.commons:commons-collections4:jar:4.2
  download org.apache.commons:commons-configuration2:jar:2.5
  download commons-io:commons-io:jar:2.6
  download io.dropwizard.metrics:metrics-core:jar:3.1.1
  download io.dropwizard.metrics:metrics-graphite:jar:3.1.1
  download javax.inject:javax.inject:jar:1
  download org.apache.curator:curator-client:jar:4.0.1
  download org.apache.curator:curator-framework:jar:4.0.1
  download org.apache.curator:curator-recipes:jar:4.0.1
  download org.hdrhistogram:HdrHistogram:jar:2.1.10
  download org.mpierce.metrics.reservoir:hdrhistogram-metrics-reservoir:jar:1.1.0
  download org.slf4j:jcl-over-slf4j:jar:1.7.2
  download org.slf4j:slf4j-api:jar:1.7.12

  download log4j:log4j:jar:1.2.17 ./log4j
  download org.slf4j:slf4j-log4j12:jar:1.7.12 ./log4j

  echo -e "Done!\n"
  echo "NOTE - The dependencies downloaded have been tested with some versions of Hadoop, Zookeeper, and Accumulo."
  echo "There is no guarantee they will work with all versions. Fluo chose to defer dependency resolution to as"
  echo "late as possible in order to make it easier to resolve dependency conflicts.  If you run into a dependency"
  echo "conflict in your environment, please consider bringing it up on the Fluo dev list."
  ;;
*)
  echo -e "Usage: fetch.sh <DEPENDENCIES>\n"
  echo -e "where <DEPENDENCIES> can be the following:\n"
  echo "   ahz       Download Accumulo, Hadoop, Zookeeper dependencies"
  echo -e "   extra     Download extra Fluo dependencies\n"
  echo "For 'ahz', the versions of Hadoop, Accumulo, & Zookeeper are specifed in ahz/pom.xml."
  echo -e "However, you can override them using the command below:\n"
  echo "./fetch.sh ahz -Daccumulo.version=2.0.0 -Dhadoop.version=3.1.1 -Dzookeeper.version=3.4.14"
esac
