name: Deploying

on:
  push:
    branches:
      - master

jobs:
  build_pwa:
    name: Build PWA
    runs-on: ubuntu-latest

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

      - uses: pnpm/action-setup@v2
        with:
          version: 8

      - name: Install Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: "pnpm"

      - name: Install pnpm packages
        run: pnpm install

      - name: Build project
        run: pnpm run build:pwa

      - name: Upload production-ready build files
        uses: actions/upload-artifact@v4
        with:
          name: pwa
          path: ./dist

  build:
    name: Build
    runs-on: ubuntu-latest

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

      - uses: pnpm/action-setup@v2
        with:
          version: 8

      - name: Install Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: "pnpm"

      - name: Install pnpm packages
        run: pnpm install

      - name: Build project
        run: pnpm run build

      - name: Upload production-ready build files
        uses: actions/upload-artifact@v4
        with:
          name: normal
          path: ./dist

  release:
    name: Release
    needs: [build, build_pwa]
    runs-on: ubuntu-latest

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

      - name: Download PWA artifact
        uses: actions/download-artifact@v4
        with:
          name: pwa
          path: ./dist_pwa

      - name: Zip PWA files
        run: cd dist_pwa && zip -r ../p-stream.pwa.zip .

      - name: Download normal artifact
        uses: actions/download-artifact@v4
        with:
          name: normal
          path: ./dist_normal

      - name: Zip normal files
        run: cd dist_normal && zip -r ../p-stream.zip .

      - name: Get version
        id: package-version
        uses: martinbeentjes/npm-get-version-action@main

      - name: Create Release
        id: create_release
        uses: actions/create-release@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          tag_name: ${{ steps.package-version.outputs.current-version }}
          release_name: P-Stream v${{ steps.package-version.outputs.current-version }}
          draft: false
          prerelease: false

      - name: Upload release (PWA)
        uses: actions/upload-release-asset@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ steps.create_release.outputs.upload_url }}
          asset_path: ./p-stream.pwa.zip
          asset_name: p-stream.pwa.zip
          asset_content_type: application/zip

      - name: Upload Release (Normal)
        uses: actions/upload-release-asset@v1
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        with:
          upload_url: ${{ steps.create_release.outputs.upload_url }}
          asset_path: ./p-stream.zip
          asset_name: p-stream.zip
          asset_content_type: application/zip

  registry:
    name: Push to registry
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write
      id-token: write

    env:
      REGISTRY: ghcr.io
      IMAGE_NAME: ${{ github.repository }}

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

      - name: Setup Docker buildx
        uses: docker/setup-buildx-action@v3

      - name: Get version
        id: package-version
        uses: martinbeentjes/npm-get-version-action@main

      - name: Log into registry ${{ env.REGISTRY }}
        uses: docker/login-action@v3
        with:
          registry: ${{ env.REGISTRY }}
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Extract Docker metadata
        id: meta
        uses: docker/metadata-action@v5
        with:
          images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
          flavor: |
            latest=auto
          tags: |
            type=semver,pattern={{version}},value=v${{ steps.package-version.outputs.current-version }}

      - name: Build and push Docker image
        id: build-and-push
        uses: docker/build-push-action@v5
        with:
          push: true
          platforms: linux/amd64,linux/arm64
          context: .
          labels: ${{ steps.meta.outputs.labels }}
          tags: ${{ steps.meta.outputs.tags }}
          cache-from: type=gha
          cache-to: type=gha,mode=max
