#!/bin/bash

set -e

readonly DEST_REPO="$(dirname $(readlink -f "$0"))/../.."
readonly INPUT_REPO="m2repository"
readonly STAGE_REPO="m2staged"
readonly DEST_ANDROID_REPO="${DEST_REPO}/prebuilts/manifest-merger"

if ! TEMP_DIR=$(mktemp -d); then
    echo "ERROR: failed to create dir"
    exit 1
fi
readonly TEMP_DIR

function cleanup() {
    rm -rf "${TEMP_DIR}"
}

trap cleanup EXIT

cd "${TEMP_DIR}"

function usage() {
  cat <<EOF
Usage: $(basename $0) group:artifact:version[:classifier][@extension] [group:artifact:version[:classifier][@extension]...]

Downloads the specified artifacts into the appropriate subdirectory of ${DEST_REPO}/prebuilts

EOF
  exit 1
}

# usage: downloadArtifacts "$group:$artifact:$version[:classifier][@extension]..."
function downloadArtifacts() {
  [ -z "$1" ] && usage

  echo "downloading dependencies into ${INPUT_REPO}"
  rm -rf "${INPUT_REPO}"
  for arg in $*; do
    echo "importing ${arg}"
    IFS=@ read -r dependency extension <<< "${arg}"
    IFS=: read -ra FIELDS <<< "${dependency}"
    local -r groupId="${FIELDS[0]}"
    local -r artifactId="${FIELDS[1]}"
    local -r version="${FIELDS[2]}"
    local -r classifier="${FIELDS[3]}"

    # download the actual artifact
    downloadArtifact "${groupId}" "${artifactId}" "${version}" "${classifier}" "${extension}"

    # try to download the sources jar
    downloadArtifact "${groupId}" "${artifactId}" "${version}" "sources" "jar" || true

    # go to next artifact
  done
  echo "done downloading dependencies"
}

# usage: generatePomFile "$pomFile" "$group" "$artifact" "$version" "$classifier" "$extension"
function generatePomFile() {
  local -r pomFile="$1"
  local -r groupId="$2"
  local -r artifactId="$3"
  local -r version="$4"
  local -r classifier="$5"
  local -r extension="$6"

  local pomDependencies=""

  echo "creating ${pomFile}"
  cat <<EOF > "${pomFile}"
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.google.android.build</groupId>
  <artifactId>m2repository</artifactId>
  <version>1.0</version>
  <repositories>
    <repository>
      <id>google</id>
      <name>Google</name>
      <url>https://maven.google.com</url>
    </repository>
    <repository>
      <id>jcenter</id>
      <name>JCenter</name>
      <url>https://jcenter.bintray.com</url>
    </repository>
  </repositories>
  <dependencies>
    <dependency>
       <groupId>${groupId}</groupId>
       <artifactId>${artifactId}</artifactId>
       <version>${version}</version>
EOF

if [ -n "${classifier}" ]; then
   cat <<EOF >> "${pomFile}"
       <classifier>${classifier}</classifier>
EOF
fi

if [ -n "${extension}" ]; then
  cat <<EOF >> "${pomFile}"
       <type>${extension}</type>
EOF
fi

cat <<EOF >> "${pomFile}"
    </dependency>
  </dependencies>
  <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>2.8</version>
                <executions>
                    <execution>
                        <id>default-cli</id>
                        <configuration>
                            <includeScope>runtime</includeScope>
                            <addParentPoms>true</addParentPoms>
                            <copyPom>true</copyPom>
                            <useRepositoryLayout>true</useRepositoryLayout>
                            <outputDirectory>m2repository</outputDirectory>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>
EOF

  echo "done creating ${pomFile}"
}

# usage: downloadArtifact "$group" "$artifact" "$version" "$classifier" "$extension"
function downloadArtifact() {
  local -r pomFile="${PWD}/pom.xml"

  generatePomFile "${pomFile}" "$@"

  echo "downloading one dependency into ${INPUT_REPO}"
  mvn -f "${pomFile}" dependency:copy-dependencies
  echo "done downloading one dependency into ${INPUT_REPO}"
}

# generates an appropriately formatted repository for merging into existing repositories,
# by computing artifact metadata
function createStageRepo() (
  echo "staging to ${STAGE_REPO}"
  rm -rf "${STAGE_REPO}"

  for f in $(find "${INPUT_REPO}" -type f ! -name "*.sha1" ! -name "*.md5"); do
      local relPath="${f##${INPUT_REPO}}"
      local relDir=$(dirname "${relPath}")

      local fileName=$(basename "${relPath}")
      local writeChecksums=true

      local destDir="${STAGE_REPO}/${relDir}"
      local destFile="${STAGE_REPO}/${relPath}"
      if [ "${fileName}" == "maven-metadata-local.xml" ]; then
        writeChecksums=false
        destFile="${destDir}/maven-metadata.xml"
      fi

      mkdir -p "${destDir}"
      if ${writeChecksums}; then
        local md5=$(md5sum "${f}" | sed 's/ .*//')
        local sha1=$(sha1sum "${f}" | sed 's/ .*//')
        echo -n ${md5} > "${destFile}.md5"
        echo -n ${sha1} > "${destFile}.sha1"
      fi
      cp "${f}" "${destFile}"
  done

  echo "done staging to ${STAGE_REPO}"
)

function announceCopy() {
  local -r input="$1"
  local -r output="$2"
  if [ -e "${input}" ]; then
    echo "copying '${input}' to '${output}'"
    cp -rT "${input}" "${output}"
  fi
}

function exportArtifact() {
  echo "exporting"

  mkdir -p "${DEST_ANDROID_REPO}/com/android"
  announceCopy "${STAGE_REPO}/com/android" "${DEST_ANDROID_REPO}/com/android"
  rm -rf "${STAGE_REPO}/com/android"

  echo "done exporting"
}


function main() {
  downloadArtifacts "$@"
  createStageRepo
  exportArtifact
}

main "$@"