name: CI

on:
  push:
    branches:
      - main
      - feature/**

jobs:
  test:
    runs-on: ubuntu-latest

    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Install dependencies
        run: |
          npm ci
          # Playwright 브라우저 및 시스템 의존성을 한 번 설치해 두면
          # self-hosted runner 캐시를 통해 이후 실행 속도가 빨라진다.
          npx playwright install --with-deps

      - name: Generate Prisma Client
        env:
          # CI에서는 실제 DB에 접속하지 않고 Prisma Client만 생성하면 되므로,
          # 유효한 형식의 더미 DATABASE_URL 을 사용한다.
          DATABASE_URL: postgresql://example:example@localhost:5432/example
          # Prisma 엔진 바이너리 체크섬 파일을 원격에서 가져오지 못하는 경우(예: 500 오류)에도
          # CI가 계속 진행되도록 체크섬 누락을 무시한다.
          PRISMA_ENGINES_CHECKSUM_IGNORE_MISSING: "1"
        run: |
          npx prisma generate

      - name: Run unit tests
        if: github.event_name == 'push'
        env:
          # API 유닛 테스트에서도 PrismaClient가 필요하므로,
          # generate 단계와 동일한 더미 DATABASE_URL 을 사용한다.
          DATABASE_URL: postgresql://example:example@localhost:5432/example
          # 테스트 중 Prisma가 엔진 체크섬 파일을 다시 확인하는 경우를 대비해 동일 설정을 적용한다.
          PRISMA_ENGINES_CHECKSUM_IGNORE_MISSING: "1"
        run: |
          npm test

      - name: Run Playwright E2E tests
        if: github.event_name == 'push' && github.ref == 'refs/heads/main'
        run: |
          npx playwright test

  pr_and_merge:
    needs: test
    # feature/* 브랜치에 push 되었을 때만 실행한다.
    if: ${{ startsWith(github.ref, 'refs/heads/feature/') }}
    runs-on: ubuntu-latest

    steps:
      - name: Install jq
        run: |
          apt-get update
          apt-get install -y jq

      - name: Create or update PR and try auto-merge
        env:
          CI_BASE_URL: ${{ secrets.CI_BASE_URL }}
          CI_TOKEN: ${{ secrets.CI_TOKEN }}
          CI_OWNER: ${{ secrets.CI_OWNER }}
          CI_REPO: ${{ secrets.CI_REPO }}
          BRANCH_REF: ${{ github.ref }}
          BRANCH_NAME: ${{ github.ref_name }}
        run: |
          set -e

          if [ -z "$CI_BASE_URL" ] || [ -z "$CI_TOKEN" ] || [ -z "$CI_OWNER" ] || [ -z "$CI_REPO" ]; then
            echo "CI_* 시크릿이 설정되지 않아 PR/자동 머지를 건너뜁니다." >&2
            exit 0
          fi

          echo "현재 브랜치: $BRANCH_NAME ($BRANCH_REF)"

          # 1) PR 생성 시도 (이미 존재하면 4xx를 허용)
          create_pr_payload=$(jq -n \
            --arg title "CI: $BRANCH_NAME" \
            --arg head "$BRANCH_NAME" \
            --arg base "main" \
            '{title: $title, head: $head, base: $base}')

          echo "PR 생성 시도..."
          curl -sS -X POST \
            -H "Content-Type: application/json" \
            -H "Authorization: token $CI_TOKEN" \
            "$CI_BASE_URL/api/v1/repos/$CI_OWNER/$CI_REPO/pulls" \
            -d "$create_pr_payload" || true

          # 2) 열린 PR 목록에서 해당 브랜치의 PR 번호를 찾는다.
          echo "열린 PR 목록 조회..."
          pr_list=$(curl -sS \
            -H "Authorization: token $CI_TOKEN" \
            "$CI_BASE_URL/api/v1/repos/$CI_OWNER/$CI_REPO/pulls?state=open")

          pr_number=$(echo "$pr_list" | jq ".[] | select(.head.ref == \"$BRANCH_NAME\") | .number" | head -n 1)

          if [ -z "$pr_number" ]; then
            echo "브랜치 $BRANCH_NAME 에 대한 열린 PR을 찾지 못했습니다. 종료합니다."
            exit 0
          fi

          echo "브랜치 $BRANCH_NAME 에 대한 PR #$pr_number 발견"

          # 3) main 대상으로 자동 머지 시도
          merge_payload=$(jq -n '{Do: "merge"}')

          echo "PR #$pr_number 자동 머지 시도..."
          curl -sS -X POST \
            -H "Content-Type: application/json" \
            -H "Authorization: token $CI_TOKEN" \
            "$CI_BASE_URL/api/v1/repos/$CI_OWNER/$CI_REPO/pulls/$pr_number/merge" \
            -d "$merge_payload" || true
