name: CI Job to Generate JUnit Reports with Diff and Allure Reports

on:
  schedule:
    - cron: 17 0 * * * # nightly run; 17th minute to decrease odds of delayed or dropped job
  push:
    branches:
      - main
  pull_request_target:
    branches:
      - main

permissions:
  contents: write  # Grant write permissions for contents
  checks: write    # Grant write permissions for checks, only effective on push
  pull-requests: write  # Explicitly grant write permissions for pull requests

jobs:
  generate-reports:
    runs-on: ubuntu-latest

    steps:
    - name: Checkout repository
      uses: actions/checkout@v4

    - name: Set up Python
      uses: actions/setup-python@v5
      with:
        python-version: '3.x'

    - name: Install python packages
      run: |
        pip install ansi2html
        pip install hyperon
        pip install junit2html

    - name: Make Install Script Executable
      run: chmod +x INSTALL.sh

    - name: Run Install Script to install Mettalog
      run: |
        . ./INSTALL.sh --easy
        echo $PATH >> $GITHUB_PATH

    - name: Make Test Script Executable
      run: chmod +x scripts/run_commit_tests.sh

    - name: Run Test Script to Generate Input File
      continue-on-error: true
      run: |
        TIMESTAMP=$(date +"%Y-%m-%dT%H:%M:%S")
        if [ ${{ github.event_name }} == 'schedule' ]; then
          ./scripts/run_nightly_tests.sh -t $TIMESTAMP
        else
        ./scripts/run_commit_tests.sh -t $TIMESTAMP
        fi        
        echo "TIMESTAMP=$(echo $TIMESTAMP)" >> $GITHUB_ENV
      env:
        TERM: xterm-256color

    - name: Run JUnit Report Generation Script
      continue-on-error: true
      run: |
        python scripts/into_junit.py /tmp/SHARED.UNITS $TIMESTAMP > junit.xml

    - name: Convert JUnit XML to Standard HTML Report
      continue-on-error: true
      run: |
        junit2html junit.xml junit-standard-report.html

    - name: Convert JUnit XML to Matrix HTML Report
      continue-on-error: true
      run: |
        junit2html --report-matrix junit-matrix-report.html junit.xml

    - name: Upload JUnit XML Report
      continue-on-error: true
      uses: actions/upload-artifact@v4
      with:
        name: junit-report
        path: junit.xml

    - name: Upload Standard HTML Report
      continue-on-error: true
      uses: actions/upload-artifact@v4
      with:
        name: junit-standard-html-report
        path: junit-standard-report.html

    - name: Upload Matrix HTML Report
      continue-on-error: true
      uses: actions/upload-artifact@v4
      with:
        name: junit-matrix-html-report
        path: junit-matrix-report.html

    - name: Display JUnit Test Results
      if: github.event_name == 'push'  # Only run this step on pushes to main
      uses: dorny/test-reporter@v1
      with:
        name: 'JUnit Results'
        path: 'junit.xml'
        reporter: 'java-junit'
        fail-on-error: false

    - name: Provide Report Links
      run: |
        echo "JUnit reports are available as artifacts."

    - name: Generate environment.properties
      run: |
        python scripts/generate_allure_environment.py ${{ github.sha }} ${{ github.ref_name }} > environment.properties

    - name: Upload environment.properties
      uses: actions/upload-artifact@v4
      with:
        name: environment
        path: environment.properties

    - name: Get Allure history
      uses: actions/checkout@v4
      with:
        ref: test-results
        path: test-results

    - name: Download JUnit XML Results
      uses: actions/download-artifact@v4
      with:
        name: junit-report
        path: build/allure-results

    - name: Include environment properties
      uses: actions/download-artifact@v4
      with:
        name: environment
        path: build/allure-results

    - name: Generate Allure Report
      uses: simple-elf/allure-report-action@master
      if: always()
      id: allure-report
      with:
        allure_results: build/allure-results
        gh_pages: test-results
        allure_report: allure-report
        allure_history: allure-history
        subfolder: ${{ env.SUBFOLDER }}
        keep_reports: 20
      env:
        SUBFOLDER: ${{ github.event_name == 'schedule' && 'nightly' || 'ci' }}

    - name: Deploy report to Github Pages
      if: always()
      uses: peaceiris/actions-gh-pages@v4
      with:
        github_token: ${{ secrets.GITHUB_TOKEN }}
        personal_token: ${{ secrets.GITHUB_TOKEN }}
        publish_branch: test-results
        publish_dir: allure-history

    - name: Auto-Approve the Pull Request
      if: github.event_name == 'pull_request_target'
      uses: hmarr/auto-approve-action@v4
      with:
        github-token: ${{ secrets.GITHUB_TOKEN }}