name: "mici raylib ui preview"
on:
  push:
    branches:
      - master
  pull_request_target:
    types: [assigned, opened, synchronize, reopened, edited]
    branches:
      - 'master'
    paths:
      - 'selfdrive/assets/**'
      - 'selfdrive/ui/**'
      - 'system/ui/**'
  workflow_dispatch:

env:
  UI_JOB_NAME: "Create mici raylib UI Report"
  REPORT_NAME: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' && 'master' || github.event.number }}
  SHA: ${{ github.event_name == 'push' && github.ref == 'refs/heads/master' && github.sha || github.event.pull_request.head.sha }}
  BRANCH_NAME: "openpilot/pr-${{ github.event.number }}-mici-raylib-ui"
  MASTER_BRANCH_NAME: "openpilot_master_ui_mici_raylib"
  # All report files are pushed here
  REPORT_FILES_BRANCH_NAME: "mici-raylib-ui-reports"

jobs:
  preview:
    if: github.repository == 'commaai/openpilot'
    name: preview
    runs-on: ubuntu-latest
    timeout-minutes: 20
    permissions:
      contents: read
      pull-requests: write
      actions: read
    steps:
      - uses: actions/checkout@v4
        with:
          submodules: true

      - name: Waiting for ui generation to end
        uses: lewagon/wait-on-check-action@v1.3.4
        with:
          ref: ${{ env.SHA }}
          check-name: ${{ env.UI_JOB_NAME }}
          repo-token: ${{ secrets.GITHUB_TOKEN }}
          allowed-conclusions: success
          wait-interval: 20

      - name: Getting workflow run ID
        id: get_run_id
        run: |
          echo "run_id=$(curl https://api.github.com/repos/${{ github.repository }}/commits/${{ env.SHA }}/check-runs | jq -r '.check_runs[] | select(.name == "${{ env.UI_JOB_NAME }}") | .html_url | capture("(?<number>[0-9]+)") | .number')" >> $GITHUB_OUTPUT

      - name: Getting proposed ui  # filename: pr_ui/mici_ui_replay.mp4
        id: download-artifact
        uses: dawidd6/action-download-artifact@v6
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          run_id: ${{ steps.get_run_id.outputs.run_id }}
          search_artifacts: true
          name: mici-raylib-report-1-${{ env.REPORT_NAME }}
          path: ${{ github.workspace }}/pr_ui

      - name: Getting master ui  # filename: master_ui_raylib/mici_ui_replay.mp4
        uses: actions/checkout@v4
        with:
          repository: commaai/ci-artifacts
          ssh-key: ${{ secrets.CI_ARTIFACTS_DEPLOY_KEY }}
          path: ${{ github.workspace }}/master_ui_raylib
          ref: ${{ env.MASTER_BRANCH_NAME }}

      - name: Saving new master ui
        if: github.ref == 'refs/heads/master' && github.event_name == 'push'
        working-directory: ${{ github.workspace }}/master_ui_raylib
        run: |
          git checkout --orphan=new_master_ui_mici_raylib
          git rm -rf *
          git branch -D ${{ env.MASTER_BRANCH_NAME }}
          git branch -m ${{ env.MASTER_BRANCH_NAME }}
          git config user.name "GitHub Actions Bot"
          git config user.email "<>"
          mv ${{ github.workspace }}/pr_ui/* .
          git add .
          git commit -m "mici raylib video for commit ${{ env.SHA }}"
          git push origin ${{ env.MASTER_BRANCH_NAME }} --force

      - name: Setup FFmpeg
        uses: AnimMouse/setup-ffmpeg@ae28d57dabbb148eff63170b6bf7f2b60062cbae

      - name: Finding diff
        if: github.event_name == 'pull_request_target'
        id: find_diff
        run: |
          # Find the video file from PR
          pr_video="${{ github.workspace }}/pr_ui/mici_ui_replay_proposed.mp4"
          mv "${{ github.workspace }}/pr_ui/mici_ui_replay.mp4" "$pr_video"

          master_video="${{ github.workspace }}/pr_ui/mici_ui_replay_master.mp4"
          mv "${{ github.workspace }}/master_ui_raylib/mici_ui_replay.mp4" "$master_video"

          # Run report
          export PYTHONPATH=${{ github.workspace }}
          baseurl="https://github.com/commaai/ci-artifacts/raw/refs/heads/${{ env.BRANCH_NAME }}"
          diff_exit_code=0
          python3 ${{ github.workspace }}/selfdrive/ui/tests/diff/diff.py "${{ github.workspace }}/pr_ui/mici_ui_replay_master.mp4" "${{ github.workspace }}/pr_ui/mici_ui_replay_proposed.mp4" "diff.html" --basedir "$baseurl" --no-open || diff_exit_code=$?

          # Copy diff report files
          cp ${{ github.workspace }}/selfdrive/ui/tests/diff/report/diff.html ${{ github.workspace }}/pr_ui/
          cp ${{ github.workspace }}/selfdrive/ui/tests/diff/report/diff.mp4 ${{ github.workspace }}/pr_ui/

          REPORT_URL="https://commaai.github.io/ci-artifacts/diff_pr_${{ github.event.number }}.html"
          if [ $diff_exit_code -eq 0 ]; then
            DIFF="✅ Videos are identical! [View Diff Report]($REPORT_URL)"
          else
            DIFF="❌ <strong>Videos differ!</strong> [View Diff Report]($REPORT_URL)"
          fi
          echo "DIFF=$DIFF" >> "$GITHUB_OUTPUT"

      - name: Saving proposed ui
        if: github.event_name == 'pull_request_target'
        working-directory: ${{ github.workspace }}/master_ui_raylib
        run: |
          # Overwrite PR branch w/ proposed ui, and master ui at this point in time for future reference
          git config user.name "GitHub Actions Bot"
          git config user.email "<>"
          git checkout --orphan=${{ env.BRANCH_NAME }}
          git rm -rf *
          mv ${{ github.workspace }}/pr_ui/* .
          git add .
          git commit -m "mici raylib video for PR #${{ github.event.number }}"
          git push origin ${{ env.BRANCH_NAME }} --force

          # Append diff report to report files branch
          git fetch origin ${{ env.REPORT_FILES_BRANCH_NAME }}
          git checkout ${{ env.REPORT_FILES_BRANCH_NAME }}
          cp ${{ github.workspace }}/selfdrive/ui/tests/diff/report/diff.html diff_pr_${{ github.event.number }}.html
          git add diff_pr_${{ github.event.number }}.html
          git commit -m "mici raylib ui diff report for PR #${{ github.event.number }}" || echo "No changes to commit"
          git push origin ${{ env.REPORT_FILES_BRANCH_NAME }}

      - name: Comment Video on PR
        if: github.event_name == 'pull_request_target'
        uses: thollander/actions-comment-pull-request@v2
        with:
          message: |
            <!-- _(run_id_video_mici_raylib **${{ github.run_id }}**)_ -->
            ## mici raylib UI Preview
            ${{ steps.find_diff.outputs.DIFF }}
          comment_tag: run_id_video_mici_raylib
          pr_number: ${{ github.event.number }}
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
