name: PullRequest Merge Check

on:
  pull_request:
    branches:
      - "develop"


permissions:
  contents: read
  checks: write
  id-token: write
  pull-requests: write

jobs:
  setup:
    name: Setup
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Gradle Wrapper Cache
        uses: actions/cache@v3.3.2
        with:
          path: ~/.gradle/wrapper
          key: gradle-wrapper-${{  hashFiles('gradle/wrapper/gradle-wrapper.properties') }}

      - name: Dependencies Cache
        uses: actions/cache@v3.3.2
        with:
          path: |
            ~/.gradle/cache/jars-*
            ~/.gradle/caches/transforms-*
            ~/.gradle/caches/modules-*
          key: gradle-dependencies-${{ hashFiles('**/*.gradle.kts') }}
          restore-keys: gradle-dependencies-

      - name: Cache
        uses: actions/cache@v3.3.2
        with:
          path: |
            ~/.gradle/caches/build-cache-*
            ~/.gradle/caches/[0-9]*.*
            .gradle
          key: ${{ runner.os }}-gradle-build-${{ github.workflow }}-${{ github.sha }}
          restore-keys: ${{ runner.os }}-gradle-build-${{ github.workflow }}-

      - name: Build Cache
        uses: actions/cache@v3.3.2
        with:
          path: |
            build
          key: gradle-build-${{ hashFiles('**/*.gradle.kts') }}-${{ hashFiles('**/*.kt') }}-${{ github.sha }}

      - name: Set up JDK 21
        uses: actions/setup-java@v3
        with:
          java-version: '21'
          distribution: 'temurin'
      - name: Build
        uses: gradle/gradle-build-action@v2.8.1
        with:
          arguments: testClasses

  unit-test:
    name: Unit Test
    needs: [ setup ]
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Gradle Wrapper Cache
        uses: actions/cache@v3.3.2
        with:
          path: ~/.gradle/wrapper
          key: gradle-wrapper-${{  hashFiles('gradle/wrapper/gradle-wrapper.properties') }}

      - name: Dependencies Cache
        uses: actions/cache@v3.3.2
        with:
          path: |
            ~/.gradle/cache/jars-*
            ~/.gradle/caches/transforms-*
            ~/.gradle/caches/modules-*
          key: gradle-dependencies-${{ hashFiles('**/*.gradle.kts') }}
          restore-keys: gradle-dependencies-

      - name: Cache
        uses: actions/cache@v3.3.2
        with:
          path: |
            ~/.gradle/caches/build-cache-*
            ~/.gradle/caches/[0-9]*.*
            .gradle
          key: ${{ runner.os }}-gradle-build-${{ github.workflow }}-${{ github.sha }}
          restore-keys: ${{ runner.os }}-gradle-build-${{ github.workflow }}-

      - name: Build Cache
        uses: actions/cache@v3.3.2
        with:
          path: |
            build
          key: gradle-build-${{ hashFiles('**/*.gradle.kts') }}-${{ hashFiles('src') }}-${{ github.sha }}

      - name: Set up JDK 21
        uses: actions/setup-java@v3
        with:
          java-version: '21'
          distribution: 'temurin'

      - name: Unit Test
        uses: gradle/gradle-build-action@v2.8.1
        with:
          arguments: test

      - name: Save Test Report
        if: always()
        uses: actions/cache/save@v3
        with:
          path: build/test-results
          key: unit-test-report-${{ github.sha }}

  integration-test:
    name: Integration Test
    needs: [ setup ]
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Gradle Wrapper Cache
        uses: actions/cache@v3.3.2
        with:
          path: ~/.gradle/wrapper
          key: gradle-wrapper-${{  hashFiles('gradle/wrapper/gradle-wrapper.properties') }}

      - name: Dependencies Cache
        uses: actions/cache@v3.3.2
        with:
          path: |
            ~/.gradle/cache/jars-*
            ~/.gradle/caches/transforms-*
            ~/.gradle/caches/modules-*
          key: gradle-dependencies-${{ hashFiles('**/*.gradle.kts') }}
          restore-keys: gradle-dependencies-

      - name: Cache
        uses: actions/cache@v3.3.2
        with:
          path: |
            ~/.gradle/caches/build-cache-*
            ~/.gradle/caches/[0-9]*.*
            .gradle
          key: ${{ runner.os }}-gradle-build-${{ github.workflow }}-${{ github.sha }}
          restore-keys: ${{ runner.os }}-gradle-build-${{ github.workflow }}-

      - name: Build Cache
        uses: actions/cache@v3.3.2
        with:
          path: |
            build
          key: gradle-build-${{ hashFiles('**/*.gradle.kts') }}-${{ hashFiles('src') }}-${{ github.sha }}

      - name: Set up JDK 21
        uses: actions/setup-java@v3
        with:
          java-version: '21'
          distribution: 'temurin'

      - name: MongoDB in GitHub Actions
        uses: supercharge/mongodb-github-action@1.10.0
        with:
          mongodb-version: latest

      - name: Unit Test
        uses: gradle/gradle-build-action@v2.8.1
        with:
          arguments: integrationTest

      - name: Save Test Report
        if: always()
        uses: actions/cache/save@v3
        with:
          path: build/test-results
          key: integration-test-report-${{ github.sha }}

  coverage:
    name: Coverage
    needs: [ setup ]
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Gradle Wrapper Cache
        uses: actions/cache@v3.3.2
        with:
          path: ~/.gradle/wrapper
          key: gradle-wrapper-${{  hashFiles('gradle/wrapper/gradle-wrapper.properties') }}

      - name: Dependencies Cache
        uses: actions/cache@v3.3.2
        with:
          path: |
            ~/.gradle/cache/jars-*
            ~/.gradle/caches/transforms-*
            ~/.gradle/caches/modules-*
          key: gradle-dependencies-${{ hashFiles('**/*.gradle.kts') }}
          restore-keys: gradle-dependencies-

      - name: Cache
        uses: actions/cache@v3.3.2
        with:
          path: |
            ~/.gradle/caches/build-cache-*
            ~/.gradle/caches/[0-9]*.*
            .gradle
          key: ${{ runner.os }}-gradle-build-${{ github.workflow }}-${{ github.sha }}
          restore-keys: ${{ runner.os }}-gradle-build-${{ github.workflow }}-

      - name: Build Cache
        uses: actions/cache@v3.3.2
        with:
          path: |
            build
          key: gradle-build-${{ hashFiles('**/*.gradle.kts') }}-${{ hashFiles('src') }}-${{ github.sha }}

      - name: Set up JDK 21
        uses: actions/setup-java@v3
        with:
          java-version: '21'
          distribution: 'temurin'

      - name: Run Kover
        uses: gradle/gradle-build-action@v2.8.1
        with:
          arguments: koverXmlReport -x integrationTest -x e2eTest --rerun-tasks

      - name: Add coverage report to PR
        if: always()
        id: kover
        uses: madrapps/jacoco-report@v1.6.1
        with:
          paths: |
            ${{ github.workspace }}/build/reports/kover/report.xml
          token: ${{ secrets.GITHUB_TOKEN }}
          title: Code Coverage
          update-comment: true
          min-coverage-overall: 80
          min-coverage-changed-files: 80
          coverage-counter-type: LINE

  report-tests:
    name: Report Tests
    if: success() || failure()
    needs: [ unit-test,integration-test,e2e-test ]
    runs-on: ubuntu-latest
    steps:
      - name: Restore Test Report
        uses: actions/cache/restore@v3
        with:
          path: build/test-results
          key: unit-test-report-${{ github.sha }}

      - name: Restore Test Report
        uses: actions/cache/restore@v3
        with:
          path: build/test-results
          key: integration-test-report-${{ github.sha }}

      - name: Restore Test Report
        uses: actions/cache/restore@v3
        with:
          path: build/test-results
          key: e2e-test-report-${{ github.sha }}

      - name: JUnit Test Report
        uses: mikepenz/action-junit-report@v2
        with:
          report_paths: '**/TEST-*.xml'

  lint:
    name: Lint
    needs: [ setup ]
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Gradle Wrapper Cache
        uses: actions/cache@v3.3.2
        with:
          path: ~/.gradle/wrapper
          key: gradle-wrapper-${{  hashFiles('gradle/wrapper/gradle-wrapper.properties') }}

      - name: Dependencies Cache
        uses: actions/cache@v3.3.2
        with:
          path: |
            ~/.gradle/cache/jars-*
            ~/.gradle/caches/transforms-*
            ~/.gradle/caches/modules-*
          key: gradle-dependencies-${{ hashFiles('**/*.gradle.kts') }}
          restore-keys: gradle-dependencies-

      - name: Cache
        uses: actions/cache@v3.3.2
        with:
          path: |
            ~/.gradle/caches/build-cache-*
            ~/.gradle/caches/[0-9]*.*
            .gradle
          key: ${{ runner.os }}-gradle-build-${{ github.workflow }}-${{ github.sha }}
          restore-keys: ${{ runner.os }}-gradle-build-${{ github.workflow }}-

      - name: Build Cache
        uses: actions/cache@v3.3.2
        with:
          path: |
            build
          key: gradle-build-${{ hashFiles('**/*.gradle.kts') }}-${{ hashFiles('src') }}-${{ github.sha }}

      - name: Set up JDK 21
        uses: actions/setup-java@v3
        with:
          java-version: '21'
          distribution: 'temurin'

      - name: Build with Gradle
        uses: gradle/gradle-build-action@67421db6bd0bf253fb4bd25b31ebb98943c375e1
        with:
          arguments: detektMain

      - name: "reviewdog-suggester: Suggest any code changes based on diff with reviewdog"
        if: ${{ always() }}
        uses: reviewdog/action-suggester@v1
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}

  e2e-test:
    name: E2E Test
    needs: [ setup ]
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v3

      - name: Gradle Wrapper Cache
        uses: actions/cache@v3.3.2
        with:
          path: ~/.gradle/wrapper
          key: gradle-wrapper-${{  hashFiles('gradle/wrapper/gradle-wrapper.properties') }}

      - name: Dependencies Cache
        uses: actions/cache@v3.3.2
        with:
          path: |
            ~/.gradle/cache/jars-*
            ~/.gradle/caches/transforms-*
            ~/.gradle/caches/modules-*
          key: gradle-dependencies-${{ hashFiles('**/*.gradle.kts') }}
          restore-keys: gradle-dependencies-

      - name: Cache
        uses: actions/cache@v3.3.2
        with:
          path: |
            ~/.gradle/caches/build-cache-*
            ~/.gradle/caches/[0-9]*.*
            .gradle
          key: ${{ runner.os }}-gradle-build-${{ github.workflow }}-${{ github.sha }}
          restore-keys: ${{ runner.os }}-gradle-build-${{ github.workflow }}-

      - name: Build Cache
        uses: actions/cache@v3.3.2
        with:
          path: |
            build
          key: gradle-build-${{ hashFiles('**/*.gradle.kts') }}-${{ hashFiles('src') }}-${{ github.sha }}

      - name: Set up JDK 21
        uses: actions/setup-java@v3
        with:
          java-version: '21'
          distribution: 'temurin'

      - name: MongoDB in GitHub Actions
        uses: supercharge/mongodb-github-action@1.10.0
        with:
          mongodb-version: latest

      - name: setup-chrome
        id: setup-chrome
        uses: browser-actions/setup-chrome@v1.4.0

      - name: Add Path
        run: echo ${{ steps.setup-chrome.outputs.chrome-path }} >> $GITHUB_PATH

      - name: E2E Test
        uses: gradle/gradle-build-action@v2.8.1
        with:
          arguments: e2eTest


      - name: Save Test Report
        if: always()
        uses: actions/cache/save@v3
        with:
          path: build/test-results
          key: e2e-test-report-${{ github.sha }}