name: CI

on:
  pull_request:
    branches: [ master, develop ]
  push:
    branches: [ master ]

jobs:
  quality-check:
    name: Quality Check
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20.x'
          cache: 'npm'

      - name: Install dependencies
        run: npm ci

      - name: Run ESLint
        run: npm run lint

      - name: Run Prettier check
        run: npm run format:check

      - name: Run TypeScript type check
        run: npx tsc --noEmit

  test:
    name: Test
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        node-version: ['20.x', '22.x']
        os: [ubuntu-latest]
        include:
          # 代表的な環境での追加検証
          - node-version: '20.x'
            os: windows-latest
          - node-version: '20.x'
            os: macOS-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Setup Node.js ${{ matrix.node-version }}
        uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node-version }}
          cache: 'npm'

      - name: Install dependencies
        run: npm ci

      - name: Build project
        run: npm run build

      - name: Run unit tests
        run: npm run test:unit

      - name: Install Playwright browsers
        run: |
          if [ "$RUNNER_OS" == "Linux" ]; then
            npx playwright install --with-deps
          else
            npx playwright install
          fi
        shell: bash

      - name: Debug file structure (Unix)
        if: runner.os != 'Windows'
        run: |
          echo "Current directory structure:"
          ls -la
          echo "Dist directory contents:"
          ls -la dist/
          echo "Spec fixtures directory:"
          ls -la spec/fixtures/
        shell: bash

      - name: Debug file structure (Windows)
        if: runner.os == 'Windows'
        run: |
          echo "Current directory structure:"
          dir
          echo "Dist directory contents:"
          dir dist\
          echo "Spec fixtures directory:"
          dir spec\fixtures\
        shell: cmd

      - name: Run browser tests
        run: npm run test:browser

      - name: Upload test results
        if: failure()
        uses: actions/upload-artifact@v4
        with:
          name: test-results-${{ matrix.os }}-${{ matrix.node-version }}
          path: |
            test-results/
            playwright-report/
          retention-days: 7

  build:
    name: Build
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20.x'
          cache: 'npm'

      - name: Install dependencies
        run: npm ci

      - name: Build project
        run: npm run build

      - name: Check build outputs
        run: |
          echo "Build outputs:"
          ls -la dist/
          echo "File sizes:"
          du -h dist/*

      - name: Upload build artifacts
        uses: actions/upload-artifact@v4
        with:
          name: build-artifacts
          path: dist/
          retention-days: 7

  coverage:
    name: Coverage
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20.x'
          cache: 'npm'

      - name: Install dependencies
        run: npm ci

      - name: Build project
        run: npm run build

      - name: Run tests with coverage
        run: npm run test:coverage

      - name: Upload coverage reports
        uses: actions/upload-artifact@v4
        with:
          name: coverage-report
          path: coverage/
          retention-days: 30