name: OpenAPI Check
on:
  pull_request:

jobs:
  ancestor:
    name: Common Ancestor
    runs-on: ubuntu-latest
    outputs:
      base_ref: ${{ steps.ancestor.outputs.base_ref }}
    steps:
    - name: Checkout Repository
      uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
      with:
        ref: ${{ github.event.pull_request.head.sha }}
        repository: ${{ github.event.pull_request.head.repo.full_name }}
        fetch-depth: 0
    - name: Search History
      id: ancestor
      run: |
        git remote add upstream https://github.com/${{ github.event.pull_request.base.repo.full_name }}
        git fetch --prune --progress --no-recurse-submodules upstream +refs/heads/*:refs/remotes/upstream/* +refs/tags/*:refs/tags/*

        ANCESTOR_REF=$(git merge-base upstream/${{ github.base_ref }} HEAD)

        echo "ref: ${ANCESTOR_REF}"

        echo "base_ref=${ANCESTOR_REF}" >> "$GITHUB_OUTPUT"

  head:
    name: Head Artifact
    uses: ./.github/workflows/openapi-generate.yml
    with:
      ref: ${{ github.event.pull_request.head.sha }}
      repository: ${{ github.event.pull_request.head.repo.full_name }}
      artifact: openapi-head

  base:
    name: Base Artifact
    uses: ./.github/workflows/openapi-generate.yml
    needs:
    - ancestor
    with:
      ref: ${{ needs.ancestor.outputs.base_ref }}
      repository: ${{ github.event.pull_request.base.repo.full_name }}
      artifact: openapi-base

  diff:
    name: Generate Report
    runs-on: ubuntu-latest
    needs:
    - head
    - base
    steps:
    - name: Download Head
      uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
      with:
        name: openapi-head
        path: openapi-head
    - name: Download Base
      uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
      with:
        name: openapi-base
        path: openapi-base
    - name: Detect Changes
      id: openapi-diff
      run: |
        sed -i 's:allOf:oneOf:g' openapi-head/openapi.json
        sed -i 's:allOf:oneOf:g' openapi-base/openapi.json

        mkdir -p /tmp/openapi-report
        mv openapi-head/openapi.json /tmp/openapi-report/head.json
        mv openapi-base/openapi.json /tmp/openapi-report/base.json

        docker run -v /tmp/openapi-report:/data openapitools/openapi-diff:2.1.6 /data/base.json /data/head.json --state -l ERROR --markdown /data/openapi-report.md
    - name: Upload Artifact
      uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
      with:
        name: openapi-report
        path: /tmp/openapi-report/openapi-report.md
