#!/usr/bin/env bash

function usage() {
  echo "Usage: ";
  echo " ./update_for_releases.sh";
  echo "   -s : configured settings";
  echo "   -c : clean archive of unused versions";
  echo "   -u : update (pulls from staging if needed)";
}

function set_global_variables() {
  MIN_JAVA_VERSION=17
  VERSIONS_TXT=$(pwd)/_jettyVersions.txt
  VERSIONS_PHP=$(pwd)/_jettyVersions.php
  ARC_DIR=$(pwd)/_archive
  JAVADOC_DIR=$(pwd)/javadoc
  TEMP_DIR=$ARC_DIR/temp
  SCRIPT_DIR=$(pwd)
  MAVEN_ROOT="https://repo1.maven.org/maven2/org/eclipse/jetty"
  STAGING_ROOT="https://oss.sonatype.org/content/groups/jetty-with-staging/org/eclipse/jetty"
  GITHUB_ROOT="https://github.com/eclipse/jetty.project/archive"
  DOC_ROOT_9="$MAVEN_ROOT/jetty-documentation"
  DOC_ROOT_1x="$MAVEN_ROOT/documentation/jetty-documentation"
  LOG_FILE="$ARC_DIR/update.log"
}

function print_global_variables() {
  echo "Log File: $LOG_FILE"
  echo "Versions File (txt): $VERSIONS_TXT"
  echo "Versions File (php): $VERSIONS_PHP"
  echo "Archive Directory: $ARC_DIR"
  echo "Maven Root URL: $MAVEN_ROOT"
  echo "Maven Staging Root URL: $STAGING_ROOT"
  echo "Documentation Root 9 URL: $DOC_ROOT_9"
  echo "Documentation Root 10 URL: $DOC_ROOT_10"
  echo "Github Root URL: $GITHUB_ROOT"
}

function print_execution_variables() {
  # TODO make dynamic
  echo "Jetty 9.2 = $jetty_9_2"
  echo "Jetty 9.3 = $jetty_9_3"
  echo "Jetty 9.4 = $jetty_9_4"
  echo "Jetty 10.0 = $jetty_10_0"
  echo "Jetty 11.0 = $jetty_11_0"
}


function init() {
  echo ""

  set_global_variables;
  check_java_version;
  reset_log;
  create_archive_directory;
}

function check_java_version() {

  if [[ -z "${JAVA_HOME}" ]]; then
    echo "Error: JAVA_HOME environment variable not set, required for javadoc generation."
    exit 1
  fi

  local java_version=$(java -version 2>&1 | head -n1 | sed -r 's/.*version "([0-9]*).*$/\1/');

  if (( $java_version < $MIN_JAVA_VERSION)); then
    echo "Error: java version must be $MIN_JAVA_VERSION+";
  fi

}


function gather_current_versions() {

  local version_file="_jettyVersions.txt"

  # TODO make dynamic
  # shellcheck disable=SC2162
  while IFS= read line; do
    if [[ $line == *"9.2."* ]]; then
      jetty_9_2=$line
    fi

    if [[ $line == *"9.3."* ]]; then
      jetty_9_3=$line
    fi

    if [[ $line == *"9.4."* ]]; then
      jetty_9_4=$line
    fi

    if [[ $line == *"10.0."* ]]; then
      jetty_10_0=$line
    fi

    if [[ $line == *"11.0."* ]]; then
      jetty_11_0=$line
    fi

  done <"$version_file"

}

#
# set up archive directory if it doesn't exist
#
function create_archive_directory() {

  if [ ! -d "$ARC_DIR" ]; then
    mkdir "$ARC_DIR"
  fi

}

function create_temp_directory() {

  if [[ ! -d "$TEMP_DIR" ]]; then
    mkdir "$TEMP_DIR"
  fi
}

function delete_temp_directory() {

  if [[ -d "$TEMP_DIR" ]]; then
    rm -Rf "$TEMP_DIR";
  fi
}

function reset_log() {
  if [[ -e "$LOG_FILE" ]]; then
    rm "$LOG_FILE";
  fi
}

function get_primary_version() {
  local version="$1";

  IFS='.' read -ra ver <<<"$version"

  echo "jetty-${ver[0]}";
}

function get_javadoc_version() {
  local primary_version=$1
  local javadoc_version

  if [[ $primary_version == "jetty-9" ]]; then
    javadoc_version=$(sed -e ':a' -e 'N;$!ba' -e 's/.*Project \([0-9.v]*\) API.*/\1/' "$JAVADOC_DIR/jetty-9/index.html")
  elif [[ $primary_version == "jetty-10" ]]; then
    javadoc_version=$(sed -e ':a' -e 'N;$!ba' -e 's/.*Doc - v\([0-9.]*\)).*/\1/' "$JAVADOC_DIR/jetty-10/index.html")
  elif [[ $primary_version == "jetty-11" ]]; then
    javadoc_version=$(sed -e ':a' -e 'N;$!ba' -e 's/.*Doc - v\([0-9.]*\)).*/\1/' "$JAVADOC_DIR/jetty-11/index.html")
  fi

  echo "$javadoc_version"
}

function get_version_from_file_1x() {
  local filename=$1

  version=$("$filename")

  echo "$version"
}

#
# we want to clear out files that are no longer required based on the current versions
#
function clean_archive_directory() {

  # TODO implement correct behavior
  if [ -d "$ARC_DIR" ]; then
    rm -R "$ARC_DIR"
  fi

}

function maven_download() {
  local artifact=$1
  local version=$2
  local filename=$3

  if [[ ! -f "$ARC_DIR/$filename" ]]; then
    echo "  - downloading $filename"
    wget -O "$ARC_DIR/$filename" "$MAVEN_ROOT/$artifact/$version/$filename" &>>"$LOG_FILE";
    local download_status=$?;

    if [[ download_status -ne 0 ]]; then
      echo "  - staging download $filename"
      wget -O "$ARC_DIR/$filename" "$STAGING_ROOT/$artifact/$version/$filename" &>>"$LOG_FILE";
      local staging_status=$?;

      if [[ staging_status -ne 0 ]]; then
        echo "  - download failed: $filename";
        rm "$ARC_DIR/$filename";
        exit 1
      fi
    fi
  fi
}

function github_download() {
  local filename=$1

  if [[ ! -f "$ARC_DIR/$filename" ]]; then
    echo "  - downloading $filename"
    wget -O "$ARC_DIR/$filename" "$GITHUB_ROOT/$filename" &>>"$LOG_FILE";
    local download_status=$?;

    if [[ download_status -ne 0 ]]; then
      echo "  - download failed: $filename";
      rm "$ARC_DIR/$filename";
      exit 1
    fi
  fi
}


function download_distribution_files() {
  local version=$1

  if [[ "$version" == "1"* ]]; then
    local artifact="jetty-home"
  else
    local artifact="jetty-distribution"
  fi

  local filename_zasc="$artifact-$version.zip.asc";
  local filename_zmd5="$artifact-$version.zip.md5";
  local filename_zsha1="$artifact-$version.zip.sha1";
  local filename_tasc="$artifact-$version.tar.gz.asc";
  local filename_tmd5="$artifact-$version.tar.gz.md5";
  local filename_tsha1="$artifact-$version.tar.gz.sha1";
  maven_download "$artifact" "$version" "$filename_zasc";
  maven_download "$artifact" "$version" "$filename_zmd5";
  maven_download "$artifact" "$version" "$filename_zsha1";
  maven_download "$artifact" "$version" "$filename_tasc";
  maven_download "$artifact" "$version" "$filename_tmd5";
  maven_download "$artifact" "$version" "$filename_tsha1";
}

function download_documentation_files() {
  local artifact="jetty-documentation";
  local version=$1;
  local html_filename="$artifact-$version-html.zip";

  local primary_version
  primary_version=$(get_primary_version "$version")

  if [[ $primary_version == "jetty-9" ]]; then
    maven_download "$artifact" "$version" "$html_filename";
  else
    # this is a hack, should clean this up
    maven_download "documentation/$artifact" "$version" "$html_filename";
  fi
}

function download_github_files() {
  local version=$1
  local filename="jetty-$version.zip"

  github_download "$filename"

}

function download_missing_files() {
  create_archive_directory

  echo " - phase: downloads"

  # TODO make dynamic
  # Jetty 9.2
  download_distribution_files "$jetty_9_2"

  # Jetty 9.3
  download_distribution_files "$jetty_9_3"

  local versions=($jetty_9_4 $jetty_10_0 $jetty_11_0)
  for version in "${versions[@]}"; do
    download_distribution_files "$version"
    download_documentation_files "$version"
    download_github_files "$version"
  done
}

function get_dist_info() {
  if [[ "$1" == "1"* ]]; then
    cat "$ARC_DIR/jetty-home-$1.$2"
  else
    cat "$ARC_DIR/jetty-distribution-$1.$2"
  fi
}

function generate_version_php() {

  # shellcheck disable=SC2206
  # TODO make dynamic
  local versions=($jetty_9_2 $jetty_9_3 $jetty_9_4 $jetty_10_0 $jetty_11_0)

    echo " - phase: version_php generation"

  rm "$VERSIONS_PHP"

  {
    echo "<?php"
    echo "/**"
    echo "* Copyright (c) 2020 Eclipse Foundation."
    echo "*"
    echo "* This program and the accompanying materials are made"
    echo "* available under the terms of the Eclipse Public License 2.0"
    echo "* which is available at https://www.eclipse.org/legal/epl-2.0/"
    echo "*"
    echo "* Contributors:"
    echo "*   Jesse McConnell"
    echo "*"
    echo "* SPDX-License-Identifier: EPL-2.0"
    echo "*/"
    echo "\$jetty = array ("
    for version in "${versions[@]}"; do
      # shellcheck disable=SC2206
      IFS='.' read -ra ver <<<"$version"
      # shellcheck disable=SC2128
      # shellcheck disable=SC2211
      echo " 'jetty_${ver[0]}.${ver[1]}' => array ("
      echo "    'version' => '$version',"
      echo "    'zip.md5' => '$(get_dist_info "$version" "zip.md5")',"
      echo "    'zip.sha1' => '$(get_dist_info "$version" "zip.sha1")',"
      #echo "    'zip.asc' => '$(get_dist_info "$version" "zip.asc")',";
      echo "    'tgz.md5' => '$(get_dist_info "$version" "tar.gz.md5")',"
      echo "    'tgz.sha1' => '$(get_dist_info "$version" "tar.gz.sha1")',"
      #echo "    'tgz.asc' => '$(get_dist_info "$version" "tgz.asc")',";
      if [ "$version" == "${versions[-1]}" ]; then
        echo "  )"
      else
        echo "  ),"
      fi
    done
    echo ");"
  } >>"$VERSIONS_PHP"
}

function process_documentation() {
  # shellcheck disable=SC2206
  local versions=($jetty_9_4 $jetty_10_0 $jetty_11_0);

  echo " - phase: documentation"

  create_temp_directory;

  for version in "${versions[@]}"; do
    local temp_ver_dir="$TEMP_DIR/$version";
    unzip -d "$temp_ver_dir" "$ARC_DIR/jetty-documentation-$version-html.zip" &>>"$LOG_FILE";
  done

  {
    for version in "${versions[@]}"; do
      local primary_version;
      primary_version=$(get_primary_version "$version");

      echo "  - deploying documentation for $version"

      rsync -avh "$TEMP_DIR/$version/$version/" "$(pwd)/documentation/$primary_version";
    done;
  } &>>"$LOG_FILE";

  delete_temp_directory;
}

function process_contribution_guide {
  local version=$jetty_10_0;

  echo " - phase: position contribution guide";

  create_temp_directory;

  {
    local temp_ver_dir="$TEMP_DIR/$version";
    unzip -d "$temp_ver_dir" "$ARC_DIR/jetty-documentation-$version-html.zip";

    rsync -avh "$TEMP_DIR/$version/$version/contribution-guide" "$(pwd)/documentation";
  } &>>"$LOG_FILE";

  delete_temp_directory;
}

function process_javadoc() {
  # shellcheck disable=SC2206
  local versions=($jetty_9_4 $jetty_10_0 $jetty_11_0)

  echo " - phase: javadoc"

  create_temp_directory

  for version in "${versions[@]}"; do
    local primary_version;
    local javadoc_version;
    local temp_build_dir="$TEMP_DIR/$version";

    primary_version=$(get_primary_version "$version");
    javadoc_version=$(get_javadoc_version "$primary_version");

    if [[ $version == "$javadoc_version" ]]; then
      echo "  - skipping javadoc generation for $version";
    else
      build_javadoc "$primary_version" "$version" "$temp_build_dir"
      deploy_javadoc "$primary_version" "$version" "$temp_build_dir"
    fi
  done;

  delete_temp_directory
}

function build_javadoc() {
  local primary_version=$1
  local version=$2
  local temp_build_dir=$3

  local filename="jetty-$version.zip"

  echo "  - building javadoc for $version"

  github_download "$filename";

  {
    unzip -d "$temp_build_dir" -o "$ARC_DIR/$filename"
    cd "$temp_build_dir/jetty.project-jetty-$version" || exit 1

    if [[ $primary_version == "jetty-9" ]]; then
      mvn clean install -DskipTests
      mvn javadoc:aggregate
    elif [[ $primary_version == "jetty-10" ]]; then
      mvn clean install -DskipTests
      cd javadoc || exit 1
      mvn clean install
      cd .. || exit 1
    elif [[ $primary_version == "jetty-11" ]]; then
      mvn clean install -DskipTests
      cd javadoc || exit 1
      mvn clean install
      cd .. || exit 1
    fi

    cd "$SCRIPT_DIR" || exit 1
  } &>>"$LOG_FILE";
}


function deploy_javadoc() {
  local primary_version=$1
  local version=$2
  local temp_build_dir=$3
  local javadoc_src_dir

  echo "  - deploying javadoc for $version"

  if [[ $primary_version == "jetty-9" ]]; then
    javadoc_src_dir="$temp_build_dir/jetty.project-jetty-$version/target/site/apidocs/"
  elif [[ $primary_version == "jetty-10" ]]; then
    javadoc_src_dir="$temp_build_dir/jetty.project-jetty-$version/javadoc/target/site/apidocs/"
  elif [[ $primary_version == "jetty-11" ]]; then
    javadoc_src_dir="$temp_build_dir/jetty.project-jetty-$version/javadoc/target/site/apidocs/"
  fi

  rsync -avh "$javadoc_src_dir" "$JAVADOC_DIR/$primary_version" &>>"$LOG_FILE";

}


#
# main
#
function main() {
  directive=$1

  # print out the settings this script operates under
  if [[ $directive == "-s" ]]; then
    init;
    gather_current_versions;
    print_global_variables;
    print_execution_variables;
    #echo "test" &>>"$LOG_FILE";
    exit 0;
  fi

  # run an update process for any version changes
  if [[ $directive == "-u" ]]; then
    init;
    gather_current_versions;
    download_missing_files;
    generate_version_php;
    process_documentation;
    process_contribution_guide;
    process_javadoc;
    exit 0;
  fi

  # just to test some things
  #if [[ $directive == "-t" ]]; then
  #  echo "testing javadoc"
  #  init;
  #  gather_current_versions;
  #  process_javadoc
  #  exit 0;
  #fi

  # print usage
  usage;
  exit 0;
}

main "$1"
