name: PullRequest Merge Check

on:
  pull_request:
    branches:
      - "develop"
    types:
      - opened # default
      - reopened # default
      - synchronize # default
      - ready_for_review # 必要


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

jobs:
  setup:
    name: Setup
    if: github.event.pull_request.draft == false
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4

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

      - name: Dependencies Cache
        uses: actions/cache@v4.0.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@v4.0.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@v4.0.2
        with:
          path: |
            build
          key: gradle-build-${{ hashFiles('**/*.gradle.kts') }}-${{ hashFiles('**/*.kt') }}-${{ github.sha }}

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

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

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

      - name: Dependencies Cache
        uses: actions/cache@v4.0.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@v4.0.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@v4.0.2
        with:
          path: |
            build
          key: gradle-build-${{ hashFiles('**/*.gradle.kts') }}-${{ hashFiles('src') }}-${{ github.sha }}

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

      - name: Unit Test
        uses: gradle/gradle-build-action@v3.5.0
        with:
          arguments: :hideout-core:test

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

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

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

      - name: Dependencies Cache
        uses: actions/cache@v4.0.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@v4.0.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@v4.0.2
        with:
          path: |
            build
          key: gradle-build-${{ hashFiles('**/*.gradle.kts') }}-${{ hashFiles('src') }}-${{ github.sha }}

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

      - name: Run Kover

        uses: gradle/gradle-build-action@v3.5.0
        with:
          arguments: :hideout-core:koverXmlReport --rerun-tasks

      - name: Add coverage report to PR
        if: always()
        id: kover
        uses: madrapps/jacoco-report@v1.6.1
        with:
          paths: |
            ${{ github.workspace }}/hideout-core/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 ]
    runs-on: ubuntu-latest
    steps:
      - name: Restore Test Report
        uses: actions/cache/restore@v4
        with:
          path: build/test-results
          key: unit-test-report-${{ github.sha }}

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

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

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

      - name: Dependencies Cache
        uses: actions/cache@v4.0.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@v4.0.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@v4.0.2
        with:
          path: |
            build
          key: gradle-build-${{ hashFiles('**/*.gradle.kts') }}-${{ hashFiles('src') }}-${{ github.sha }}

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

      - name: Build with Gradle
        uses: gradle/gradle-build-action@ac2d340dc04d9e1113182899e983b5400c17cda1
        with:
          arguments: :hideout-core:detektMain

      - name: Auto Commit
        if: ${{ always() }}
        uses: stefanzweifel/git-auto-commit-action@v5
        with:
          commit_message: "style: fix lint (CI)"