# .github/workflows/build.yml
# Basado en la documentacion de GitHub Actions
# => https://docs.github.com/en/actions
name: build

# "on" controla cuando se ejecuta la action. En este caso, dispara el workflow
# ante un evento de "push" o de "pull request", pero solo cuando ocurra
# en las ramas de nombre "main" o "master". Un PR a "develop", o un commit
# en un branch sin PRs orientados a esas dos que indicamos no lo activará.
on:
  push:
    branches: [master, main]
  pull_request:
    branches: [master, main]
# "jobs" describe los diferentes trabajos a realizar.
jobs:
  # En esta ocasión tenemos uno solo, para buildear, testear y subir la info de coverage.
  gradle-plus-coverage:
    # "runs-on" es el encargado de correr el job. En nuestro caso una VM con ubuntu.
    runs-on: ubuntu-latest
    # "steps" enumera todos los pasos a seguir cuando se ejecute este job.
    steps:
      # Primero hacemos checkout a nuestro repo para que el job pueda acceder al mismo.
      - name: Checkout Repo
        # Para muchas funcionalidades, podemos aprovechar workflow pre-construidos mediante "uses"
        uses: actions/checkout@v4

      # Configuramos el Java apropiado en nuestro ubuntu.
      - name: Set Up Java
        uses: actions/setup-java@v4
        # "with" nos deja especificar parametros del action que importamos, tales como versión y distribución a usar.
        with:
          distribution: 'temurin'
          java-version: '21'

      # También podemos ejecutar comandos de bash, mediante "run"
      - run: |
          chmod +x ./gradlew

      # Para buildear, testear y correr jacoco tenemos una meta de gradle, runOnGithub, agregada a nuestro proyecto.
      - name: Setup Gradle
        uses: gradle/actions/setup-gradle@v4

      - name: Run test with coverage
        run: ./gradlew runOnGitHub

      # runOnGitHub, mediante jacoco, genera reportes de cobertura en distintos formatos (html, csv, lcov, entre otros).
      # Con el reporte en formato csv generamos una imagen svg que publica el % de código cubierto por los tests.
      # Cabe aclarar que esto se crea en el ubuntu de GH Actions (donde corre el CI), pero no se encuentra en el repositorio (todavía).
      - name: Generate JaCoCo Badge
        uses: cicirello/jacoco-badge-generator@v2
        with:
          badges-directory: .github/badges
          generate-coverage-badge: true
          coverage-badge-filename: jacoco.svg
          jacoco-csv-file: build/reports/jacoco/test/jacocoTestReport.csv

      # Para persistir el badge de cobertura que generamos, podemos hacer un push a la rama desde el ubuntu.
      # Siendo ejecutado "por github mismo", tendrá permiso para commitear.
      - name: Commit and push badge
        # Mediante "if" restringimos para no hacer este paso en un pull request, de forma tal que no se persista
        # el cambio en la medalla tras cada push a la rama final, hasta mergear definitivamente los cambios.
        if: ${{ github.event_name != 'pull_request' }}
        run: |
          cd .github/badges
          if [[ `git status --porcelain *.svg` ]]; then
          git config --global user.name 'github-actions'
          git config --global user.email '41898282+github-actions[bot]@users.noreply.github.com'
          git add *.svg
          git commit -m "Autogenerated JaCoCo coverage badge" *.svg
          git push
          fi

      # ¡Pero en un PR podemos comentar la cobertura! Haremos el chequeo inverso para cubrirlo
      - name: Post coverage summary in PR
        if: ${{ github.event_name == 'pull_request' }}
        uses: madrapps/jacoco-report@v1.6
        with:
          paths: ${{ github.workspace }}/build/reports/jacoco/test/jacocoTestReport.xml
          token: ${{ secrets.GITHUB_TOKEN }}
          title: Estado Actual de Cobertura

      # Finalmente, subimos un artefacto con el reporte de jacoco en formato HTML.
      # Estos archivos quedarán disponibles para descargar y revisar en Github durante un tiempo, y luego se borrarán.
      - name: Upload Jacoco coverage report
        uses: actions/upload-artifact@v4
        with:
          name: jacoco-report
          path: build/jacocoHtml/

#      # Opcional: Podríamos subir nuestro reporte a un servicio como codecov.
#      - name: Send JaCoCo reports to CodeCov
#        run: |
#          curl -Os https://uploader.codecov.io/latest/linux/codecov
#          chmod +x codecov
#          ./codecov -t ${{ CODECOV_TOKEN }}