#!/bin/bash
set -e # Exit at first error

#Init Variables
MAVEN_CLI_OPTS="--batch-mode --errors --update-snapshots --fail-at-end --no-transfer-progress"

if [ "$SCI_DEBUG" = "true" ]; then
  MAVEN_CLI_OPTS="$MAVEN_CLI_OPTS --show-version -X"
fi

# Import release helpers
. senior-ci/common/release-helpers.sh

# Import notification helpers
. senior-ci/common/notification-helpers.sh

# Set $PARALLEL
. senior-ci/common/parallel-helper.sh

# Senior CI Extensions
. senior-ci/common/senior-ci-extensions-helpers.sh

# Import docker helpers
. senior-ci/common/docker-helpers.sh

echo -e "\e[33m[CI] Atenção: Este script será descontinuado em breve. Por favor, atualize o CI utilizando o Bastion. Caso não seja possível, entre em contato com o time de DevSecOps."

# Print de variáveis para diagnóstico
print_job_vars() {
  echo ""
  echo "----------------------------------------------------------------"
  echo "[CI] Variáveis:"
  echo "[CI] - SCI_VERSION=$SCI_VERSION"
  echo "[CI] - NO_PARALLEL=$NO_PARALLEL"
  echo "[CI] - VERSION=$VERSION"
  echo "[CI] - TEAMS_HOOK=$TEAMS_HOOK"
  echo "[CI] - CI_COMMIT_TAG=$CI_COMMIT_TAG"
  echo "----------------------------------------------------------------"
  echo ""
}

use_snapshot_timestamp_version() {
  TS=$(date +"%s")
  VERSION="$CI_COMMIT_REF_SLUG-$TS-SNAPSHOT"
}

use_snapshot_version() {
  VERSION="$CI_COMMIT_REF_SLUG"

  if grep --fixed-strings --quiet "<tycho-version>" pom.xml; then
      VERSION="$(grep -m 1 "<version>" pom.xml | cut -d ">" -f 2 | awk -vRS='<|>' NR%2)"
  fi

  if [[ $VERSION != *"-SNAPSHOT"* ]]; then
    VERSION="$VERSION-SNAPSHOT"
  fi
}

set_version() {
  if grep --fixed-strings --quiet "<tycho-version>" pom.xml; then
    [[ $VERSION =~ ^v.* ]] && VERSION=$(echo $CI_COMMIT_REF_SLUG |awk '{gsub("v","");gsub(/\-/,".");}1')
    echo "[CI] Alterando versão com tycho-version:1.7.0. Nova versão - $VERSION"
    mvn org.eclipse.tycho:tycho-versions-plugin:1.7.0:set-version -DnewVersion=$VERSION
  else
    echo "[CI] Alterando versão com mvn versions:set. Nova versão - $VERSION"
    mvn $MAVEN_CLI_OPTS versions:set -DgenerateBackupPoms=false -DnewVersion=$VERSION
  fi
}

normalize_ci_commit_tag() {
  CI_COMMIT_TAG="${CI_COMMIT_TAG//-/.}"
  CI_COMMIT_TAG="${CI_COMMIT_TAG:1}"
}

publish() {
  docker_login

  echo "[CI] Realizando a compilação dos artefatos"
  mvn $MAVEN_CLI_OPTS $PARALLEL clean package -DskipTests=true

  echo "[CI] Realizando o envio dos artefatos ao servidor"
  mvn $MAVEN_CLI_OPTS $PARALLEL deploy -DretryFailedDeploymentCount=5 -DskipTests=true
}

publish_snapshot(){
    print_job_vars
    set_version
    create_dockerhub_repo
    publish
}


# Execução dos jobs
getopts "bstrpx" job
case "$job" in
  b) echo "[CI] Executando compilação do código"
    python3 senior-ci/common/validations/changelog
    python3 senior-ci/common/validations/issues

    call_extension "before_build"

    use_snapshot_version
    print_job_vars
    set_version

    mvn $MAVEN_CLI_OPTS $PARALLEL clean compile

    call_extension "after_build"
    ;;

  s) echo "[CI] Realizando release: SNAPSHOT"
    call_extension "before_release_snapshot"

    use_snapshot_version
    publish_snapshot

    call_extension "after_release_snapshot"
    ;;

  t) echo "[CI] Realizando release: SNAPSHOT TIMESTAMP"
    call_extension "before_release_snapshot"

    use_snapshot_timestamp_version
    publish_snapshot

    call_extension "after_release_snapshot"
    ;;

  r) echo "[CI] Realizando release: $2"
    python3 senior-ci/common/validations/issues

    unshallow_repo

    get_next_version $2

    create_release_branch

    call_extension "before_release"

    call_extension "before_change_changelog"

    update_changelog

    call_extension "after_change_changelog"

    set_version

    create_release_tag

    call_extension "after_release"

    echo "[CI] Criação da release versão $VERSION realizado com sucesso. O job 'package' será executado automaticamente para publicar esta versão no Maven."

    notify_release_teams_channel
    ;;
  p) echo "[CI] Publicação da versão"
    call_extension "before_packaging"

    normalize_ci_commit_tag
    print_job_vars
    publish

    USER_DEPLOY_MAIL="${GITLAB_USER_EMAIL%@senior.com.br}"
    DEPLOY_TEAMS_MESSAGE="O usuário $USER_DEPLOY_MAIL liberou a versão <$CI_PROJECT_URL/blob/$CI_COMMIT_REF_NAME/CHANGELOG.md#anchor-$VERSION_WITHOUT_DOTS|$VERSION> do projeto $CI_PROJECT_NAME."

    call_extension "after_packaging"

    notify_text_teams_channel "$DEPLOY_TEAMS_MESSAGE"

    echo "[CI] Versão $VERSION publicada no Maven com sucesso!"
    ;;

  x) echo "[CI] Realizando validação de testes e análise no SonarQube"
    python3 senior-ci/common/validations/issues
    SKIP_BUILD=`python3 senior-ci/common/validations/buildable`
    VERSION="$CI_COMMIT_REF_SLUG"

    call_extension "before_build"

    if [ "$SKIP_BUILD" = "False" ]; then

      if grep --fixed-strings --quiet "<tycho-version>" pom.xml; then
        use_snapshot_version
      fi

      print_job_vars
      set_version

      if [ -z "$SKIP_MAVEN_TEST" ]; then
        mvn $MAVEN_CLI_OPTS $PARALLEL clean test
      else
        mvn $MAVEN_CLI_OPTS $PARALLEL clean compile
      fi
    fi

    call_extension "after_build"

    python3 senior-ci/ci/sonar_scanner.py -t MAVEN -s $SKIP_BUILD
    ;;

esac
