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

#Init Variables
HELP_MESSAGE="Caso tenha qualquer dúvida sobre o processo, consulte nossa Wiki - https://git.senior.com.br/devops/senior-ci/wikis/home"

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."

# Propriedades da SDL
determine_properties() {
    OUTPUT=$(grep "^generator.java.output\+[[:space:]]*\+=" sdl.properties | cut -d "=" -f 2 | tr -d '[[:space:]]')
    : ${OUTPUT:=java}
}

generate_template() {
  GENERATE_OPTS="-Dgenerate-template=true"
}

use_snapshot_version() {
    VERSION="$CI_COMMIT_REF_SLUG-SNAPSHOT"
}

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

versioned_mvn() {
    CMD="mvn"
    CMD="$CMD $@"
	echo "$CMD"
    $CMD
}

MESSAGE_HELP="Caso tenha qualquer dúvida sobre o processo, consulte nossa Wiki - https://git.senior.com.br/devops/senior-ci/wikis/home"

# 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] - OUTPUT=$OUTPUT"
    echo "[CI] - VERSION=$VERSION"
    echo "[CI] - TEAMS_HOOK=$TEAMS_HOOK"
    echo "----------------------------------------------------------------"
    echo ""
}


# Chamadas mvn
generate_sources() {
    determine_properties

    print_job_vars

    if [ -n "$VERSION" ]; then
      sed -i "s/generator.app.version=.*/generator.app.version=${VERSION}/" sdl.properties
    fi

    echo "[CI] Executando generate-sources"
    versioned_mvn $MAVEN_CLI_OPTS $PARALLEL generate-sources $GENERATE_OPTS

    if [ -n "$VERSION" ]; then
      versioned_mvn $MAVEN_CLI_OPTS versions:set -DgenerateBackupPoms=false -DnewVersion=$VERSION
      versioned_mvn $MAVEN_CLI_OPTS versions:set -DgenerateBackupPoms=false -DnewVersion=$VERSION -DprocessAllModules -N versions:update-child-modules --file $OUTPUT
    fi
}

publish() {
    # Utilizado no package e no releaseSnapshot

    docker_login

    echo "[CI] Realizando a compilação dos artefatos"

    echo "[CI] Buildando o projeto."
    versioned_mvn $MAVEN_CLI_OPTS $PARALLEL install -DskipTests=true --file $OUTPUT

    if [ "$1" == "docker" ]; then
      if [ -z "$SKIP_IMAGE_SCAN" ]; then
        if [ -z "$SVC_IMAGE" ]; then
          IMAGE_NAME=`cat sdl.properties | sed -n -e 's/generator.app.name=//p'`
          IMAGE_NAME=`echo ${IMAGE_NAME%%[[:cntrl:]]} | xargs`
        else
          IMAGE_NAME=$SVC_IMAGE
        fi

        TAG="${CI_COMMIT_TAG:-$CI_COMMIT_REF_SLUG}"
        VERSION_FORMATED=$(echo $TAG |awk '{gsub("v","");gsub(/\-/,".");}1')
        IMAGEM=seniorsistemas/${IMAGE_NAME/$'\r'/}:${VERSION_FORMATED}
        if [[ "$(docker images -q $IMAGEM 2> /dev/null)" == "" ]]; then
          echo "[CI] Imagem $IMAGEM não encontrada, alterando para repositorio alternativo. "
          IMAGEM=seniorsa/${IMAGE_NAME/$'\r'/}:${VERSION_FORMATED}
        fi
      fi
    fi

    create_dockerhub_repo

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

publish_snapshot(){
    call_extension "before_release_snapshot"

    generate_sources

    publish
    
    call_extension "after_release_snapshot"
}

# Execução dos jobs
getopts "bstpxrg" 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

    use_snapshot_version

    call_extension "before_build"

    generate_sources

    versioned_mvn $MAVEN_CLI_OPTS $PARALLEL install -DskipTests=true -Ddockerfile.skip=true --file $OUTPUT

    call_extension "after_build"
    ;;

  s) echo "[CI] Realizando release: SNAPSHOT"
    if [ -n "$GENERATE_TEMPLATE" ]; then
      generate_template
    fi
    use_snapshot_version
    publish_snapshot
    ;;

  t) echo "[CI] Realizando release: SNAPSHOT TIMESTAMP"
    use_snapshot_timestamp_version
    publish_snapshot
    ;;

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

    generate_sources
    publish docker

    VERSION=$CI_COMMIT_TAG

    USER_DEPLOY_MAIL="${GITLAB_USER_EMAIL%@senior.com.br}"
    MESSAGE="O usuário $USER_DEPLOY_MAIL liberou a versão $VERSION do projeto $CI_PROJECT_NAME. Changelog: $CI_PROJECT_URL/blob/$CI_COMMIT_REF_NAME/CHANGELOG.md"

    call_extension "after_packaging"

    notify_text_teams_channel "$MESSAGE"

    echo "[CI] Versão $VERSION publicada no Docker Hub 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`
    use_snapshot_version

    call_extension "before_build"

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

      versioned_mvn $MAVEN_CLI_OPTS $PARALLEL install -Ddockerfile.skip=true --file $OUTPUT

    fi

    call_extension "after_build"

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

  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"

    generate_sources

    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 Docker Hub."

    notify_release_teams_channel
    ;;

  g)  echo "[CI] Gerando os primeiros arquivos a partir do SDL para esse projeto."
      generate_template
      generate_sources

      BRANCH_NAME=release/source-generation
      git checkout -B $BRANCH_NAME

      rm -rf $CI_PROJECT_DIR/.npm/ $CI_PROJECT_DIR/.cache/ $CI_PROJECT_DIR/.m2/ .npm/ .cache/ .m2 **/.npm/ **/.cache/ **/.m2/

      git add -A
      git reset $CI_PROJECT_DIR/senior-ci/ $CI_PROJECT_DIR/venv/ senior-ci/ venv/ **/senior-ci/ **/venv/
      git commit -m "[CI] Geração dos primeiros arquivos fontes SDL."

      CI_REPOSITORY_URL_FOR_PUSH=$(echo "$CI_REPOSITORY_URL" | sed -e "s|.*@\(.*\)|git@\1|" -e "s|/|:|" )
      git remote set-url --push origin "$CI_REPOSITORY_URL_FOR_PUSH"

      echo "[CI] Preparing to push changes"

      git status

      echo "[CI] Checking out default branch"
      git checkout $CI_DEFAULT_BRANCH

      echo "[CI] Merging banch $BRANCH_NAME into $CI_DEFAULT_BRANCH"
      git merge $BRANCH_NAME --allow-unrelated-histories
      git status

      echo "[CI] Pushing changes"
      git push
    ;;

    \?) valid=0
    echo "O comando não é válido. Chame o Bastion para configurar o CI do seu projeto."
    echo "Qualquer dúvida entre em contato com o time de DevOps ou consulte nossa Wiki - https://git.senior.com.br/devops/senior-ci/wikis/home"
    exit 1
    ;;
esac
