name: Clang-tidy check

on:
  schedule:
    - cron: "0 9 * * 1-5"
  workflow_dispatch:
  pull_request:
    branches: [develop]
    paths:
      - .clang_tidy
      - .github/workflows/clang-tidy.yml

concurrency:
  # Only cancel in-progress jobs or runs for the current workflow - matches against branch & tags
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

env:
  CONAN_PROFILE: clang

jobs:
  clang_tidy:
    runs-on: heavy
    container:
      image: ghcr.io/xrplf/clio-ci:latest

    permissions:
      contents: write
      issues: write
      pull-requests: write

    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Prepare runner
        uses: ./.github/actions/prepare_runner
        with:
          disable_ccache: true

      - name: Setup conan
        uses: ./.github/actions/setup_conan
        with:
          conan_profile: ${{ env.CONAN_PROFILE }}

      - name: Restore cache
        uses: ./.github/actions/restore_cache
        id: restore_cache
        with:
          conan_dir: ${{ env.CONAN_USER_HOME }}/.conan
          ccache_dir: ${{ env.CCACHE_DIR }}
          conan_profile: ${{ env.CONAN_PROFILE }}

      - name: Run conan and cmake
        uses: ./.github/actions/generate
        with:
          conan_profile: ${{ env.CONAN_PROFILE }}
          conan_cache_hit: ${{ steps.restore_cache.outputs.conan_cache_hit }}
          build_type: Release

      - name: Get number of threads
        uses: ./.github/actions/get_number_of_threads
        id: number_of_threads

      - name: Run clang-tidy
        continue-on-error: true
        shell: bash
        id: run_clang_tidy
        run: |
          run-clang-tidy-19 -p build -j "${{ steps.number_of_threads.outputs.threads_number }}" -fix -quiet 1>output.txt

      - name: Fix local includes
        if: ${{ steps.run_clang_tidy.outcome != 'success' }}
        continue-on-error: true
        shell: bash
        run: pre-commit run --all-files fix-local-includes

      - name: Print issues found
        if: ${{ steps.run_clang_tidy.outcome != 'success' }}
        shell: bash
        run: |
          sed -i '/error\||/!d' ./output.txt
          cat output.txt
          rm output.txt

      - name: Create an issue
        if: ${{ steps.run_clang_tidy.outcome != 'success' }}
        id: create_issue
        uses: ./.github/actions/create_issue
        env:
          GH_TOKEN: ${{ github.token }}
        with:
          title: "Clang-tidy found bugs in code 🐛"
          body: >
            Clang-tidy found issues in the code:

            List of the issues found: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}/

      - uses: crazy-max/ghaction-import-gpg@e89d40939c28e39f97cf32126055eeae86ba74ec # v6.3.0
        if: ${{ steps.run_clang_tidy.outcome != 'success' }}
        with:
          gpg_private_key: ${{ secrets.ACTIONS_GPG_PRIVATE_KEY }}
          passphrase: ${{ secrets.ACTIONS_GPG_PASSPHRASE }}
          git_user_signingkey: true
          git_commit_gpgsign: true

      - name: Create PR with fixes
        if: ${{ steps.run_clang_tidy.outcome != 'success' }}
        uses: peter-evans/create-pull-request@271a8d0340265f705b14b6d32b9829c1cb33d45e # v7.0.8
        env:
          GH_REPO: ${{ github.repository }}
          GH_TOKEN: ${{ github.token }}
        with:
          commit-message: "[CI] clang-tidy auto fixes"
          committer: Clio CI <skuznetsov@ripple.com>
          branch: "clang_tidy/autofix"
          branch-suffix: timestamp
          delete-branch: true
          title: "style: clang-tidy auto fixes"
          body: "Fixes #${{ steps.create_issue.outputs.created_issue_id }}. Please review and commit clang-tidy fixes."
          reviewers: "godexsoft,kuznetsss,PeterChen13579"

      - name: Fail the job
        if: ${{ steps.run_clang_tidy.outcome != 'success' }}
        shell: bash
        run: exit 1
