name: Release Pipeline

on:
  push:
    tags:
      - 'v*.*.*'

jobs:
  validate:
    name: Validate Release
    runs-on: ubuntu-latest

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

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

      - name: Install dependencies
        run: npm ci

      - name: Run full test suite
        run: npm run test:coverage

      - name: Run linting
        run: npm run lint

      - name: Validate tag matches package version
        run: |
          TAG_VERSION=${GITHUB_REF#refs/tags/v}
          PKG_VERSION=$(node -p "require('./package.json').version")
          echo "Tag version: v$TAG_VERSION"
          echo "Package version: $PKG_VERSION"
          if [ "$TAG_VERSION" != "$PKG_VERSION" ]; then
            echo "❌ Version mismatch! Tag: v$TAG_VERSION, package.json: $PKG_VERSION"
            exit 1
          fi
          echo "✅ Version validation passed"

  build-artifacts:
    name: Build Release Artifacts
    runs-on: ubuntu-latest
    needs: validate

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

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

      - name: Install dependencies
        run: npm ci

      - name: Create release directory
        run: mkdir -p release/chess-game

      - name: Copy application files
        run: |
          cp -r js release/chess-game/
          cp -r css release/chess-game/
          cp index.html release/chess-game/
          cp package.json release/chess-game/
          cp README.md release/chess-game/ 2>/dev/null || echo "No README found"
          cp LICENSE release/chess-game/ 2>/dev/null || echo "No LICENSE found"

      - name: Create source archive
        run: |
          cd release
          tar -czf chess-game-${GITHUB_REF#refs/tags/}.tar.gz chess-game/
          zip -r chess-game-${GITHUB_REF#refs/tags/}.zip chess-game/
          cd ..

      - name: Generate checksums
        run: |
          cd release
          sha256sum chess-game-*.tar.gz > checksums.txt
          sha256sum chess-game-*.zip >> checksums.txt
          cat checksums.txt
          cd ..

      - name: Create release notes
        run: |
          cat > release/RELEASE_NOTES.md << 'EOF'
          # Chess Game Release ${GITHUB_REF#refs/tags/}

          ## What's Included

          This release contains the complete HTML Chess Game application.

          ### Files
          - Source code (JavaScript ES6+ modules)
          - HTML interface
          - CSS styling
          - Documentation

          ### Installation

          1. Extract the archive
          2. Run `npm install` to install dependencies
          3. Run `npm run dev` to start the development server
          4. Open your browser to http://localhost:8080

          ### Testing

          - Run `npm test` for the test suite
          - Run `npm run test:coverage` for coverage report

          ### Requirements

          - Node.js 18 or higher
          - Modern web browser (Chrome, Firefox, Safari, Edge)

          ## Verification

          Verify the integrity of downloaded files using:
          ```bash
          sha256sum -c checksums.txt
          ```
          EOF

      - name: Upload release artifacts
        uses: actions/upload-artifact@v3
        with:
          name: release-artifacts
          path: |
            release/*.tar.gz
            release/*.zip
            release/checksums.txt
            release/RELEASE_NOTES.md
          retention-days: 90

  create-release:
    name: Create GitHub/Gitea Release
    runs-on: ubuntu-latest
    needs: build-artifacts

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

      - name: Download artifacts
        uses: actions/download-artifact@v4
        with:
          name: release-artifacts
          path: release/

      - name: Extract version info
        id: version
        run: |
          VERSION=${GITHUB_REF#refs/tags/v}
          echo "version=$VERSION" >> $GITHUB_OUTPUT
          echo "tag=${GITHUB_REF#refs/tags/}" >> $GITHUB_OUTPUT

      - name: Create Release
        uses: actions/create-release@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          tag_name: ${{ github.ref }}
          release_name: Chess Game ${{ steps.version.outputs.tag }}
          body_path: release/RELEASE_NOTES.md
          draft: false
          prerelease: false

      - name: Upload tar.gz asset
        uses: actions/upload-release-asset@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ steps.create_release.outputs.upload_url }}
          asset_path: ./release/chess-game-${{ steps.version.outputs.tag }}.tar.gz
          asset_name: chess-game-${{ steps.version.outputs.tag }}.tar.gz
          asset_content_type: application/gzip

      - name: Upload zip asset
        uses: actions/upload-release-asset@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ steps.create_release.outputs.upload_url }}
          asset_path: ./release/chess-game-${{ steps.version.outputs.tag }}.zip
          asset_name: chess-game-${{ steps.version.outputs.tag }}.zip
          asset_content_type: application/zip

      - name: Upload checksums
        uses: actions/upload-release-asset@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ steps.create_release.outputs.upload_url }}
          asset_path: ./release/checksums.txt
          asset_name: checksums.txt
          asset_content_type: text/plain

  notify:
    name: Post-Release Notifications
    runs-on: ubuntu-latest
    needs: create-release
    if: success()

    steps:
      - name: Release success notification
        run: |
          echo "✅ Release ${GITHUB_REF#refs/tags/} created successfully!"
          echo "📦 Artifacts uploaded and available for download"
          echo "🎉 Release pipeline completed"
