name: Flutter 테스트

on:
  push:
    branches: [ main, develop ]
  pull_request:
    branches: [ main, develop ]
  workflow_dispatch:  # 수동 실행 옵션

jobs:
  test:
    name: 테스트 실행
    runs-on: ubuntu-latest
    timeout-minutes: 15  # CI 전체 타임아웃 설정

    steps:
      - name: 코드 체크아웃
        uses: actions/checkout@v3

      - name: Flutter 설정
        uses: subosito/flutter-action@v2
        with:
          flutter-version: '3.10.0'
          channel: 'stable'
          cache: true

      - name: 의존성 설치
        run: flutter pub get

      - name: 테스트 디렉토리 생성
        run: mkdir -p test_diagnostics

      - name: 테스트 실행 권한 설정
        run: |
          chmod +x ./scripts/run_tests.sh
          chmod +x ./scripts/reproduce_test.sh

      - name: Flutter 테스트 실행
        id: run_tests
        continue-on-error: true
        run: ./scripts/run_tests.sh ci --verbose
        env:
          FLUTTER_TEST_IS_CI: true

      - name: 플래키 자동 재실행 (실패 시만)
        if: steps.run_tests.outcome == 'failure'
        run: |
          echo "1차 테스트 실패 - 플래키 자동 재실행 시작"
          chmod +x ./scripts/run_and_rerun_failed.sh
          # 전체 스위트를 재실행하며, 내부적으로 per-file 폴백을 수행
          set +e
          ./scripts/run_and_rerun_failed.sh
          RERUN_STATUS=$?
          set -e
          if [ "$RERUN_STATUS" -eq 0 ]; then
            echo "재실행 성공 - 플래키로 간주하고 워크플로를 성공 처리합니다."
            echo "::set-output name=flaky_recovered::true"
          else
            echo "재실행 실패 - 실패를 유지합니다."
            exit 1
          fi

      - name: 임시 flutter 테스트 로그 수집 (/tmp)
        if: always()
        shell: bash
        run: |
          echo "임시 flutter 테스트 로그를 test_diagnostics/로 복사합니다"
          mkdir -p test_diagnostics
          # run_and_rerun_failed.sh가 출력한 /tmp 로그를 수집
          cp -v /tmp/flutter_test_*.log test_diagnostics/ 2>/dev/null || true
          cp -v /tmp/flutter_test_*.log.clean test_diagnostics/ 2>/dev/null || true
          # machine 리포터 로그 등 기타 진단 파일 수집 시도
          cp -v /tmp/*flutter*test*.* test_diagnostics/ 2>/dev/null || true

      - name: 테스트 진단 정보 수집
        if: failure()
        run: |
          echo "테스트 실패 - 진단 정보 수집 중..."
          ls -la test_diagnostics/
          cat test_diagnostics/*.log || echo "로그 파일 없음"
          cat test_diagnostics/*.txt || echo "분석 파일 없음"

      - name: 테스트 진단 정보 업로드
        if: always()
        uses: actions/upload-artifact@v3
        with:
          name: test-diagnostics
          path: test_diagnostics/
          retention-days: 7
          if-no-files-found: ignore
