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 ../movie-web.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 ../movie-web.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: Movie web 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: ./movie-web.pwa.zip
        asset_name: movie-web.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: ./movie-web.zip
        asset_name: movie-web.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