#Tabs not spaces, you moron :)

name: CI for netris:warp

on:
    pull_request:
        paths:
            - "warp.Dockerfile"
            - ".github/workflows/warp.yml"
    schedule:
        - cron: 0 0 * * * # At the end of everyday
    workflow_dispatch:
    push:
        branches: [main]
        paths:
            - "warp.Dockerfile"
            - ".github/workflows/warp.yml"
        tags:
            - v*.*.*
    release:
        types: [published, created]

env:
  REGISTRY: ghcr.io
  IMAGE_NAME: nestriness/nestri
  BASE_TAG_PREFIX: warp

# concurrency:
#   group: ${{ github.workflow }}-${{ github.ref == 'refs/heads/main' && github.run_id || github.event.pull_request.number || github.ref }}
#   cancel-in-progress: true
  
jobs:
    build-docker-pr:
        name: Build image on pr
        runs-on: ubuntu-latest
        if: ${{ github.event_name == 'pull_request' }}
        steps:
            -
              name: Checkout repo
              uses: actions/checkout@v4
              with:
                submodules: recursive
            - 
              name: Setup Docker Buildx
              uses: docker/setup-buildx-action@v3
            - 
              name: Build Docker image
              uses: docker/build-push-action@v5
              with:
                file: warp.Dockerfile
                context: ./
                push: false
                load: true
                tags: netris:warp

    build-docker-main:
        name: Build image on merge to main
        if: ${{github.ref == 'refs/heads/main'}}
        runs-on: ubuntu-latest
        permissions:
            contents: read
            packages: write
        steps:
            -
              name: Checkout repo
              uses: actions/checkout@v4
              with:
                submodules: recursive
            - 
              name: Log into registry ${{ env.REGISTRY }}
              uses: docker/login-action@v3
              with:
                registry: ${{ env.REGISTRY }}
                username: ${{ github.actor }}
                password: ${{ secrets.GIT_MASTER_TOKEN }}
            - 
              name: Extract Container metadata
              id: meta
              uses: docker/metadata-action@v5
              with:
                images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}/${{ env.BASE_TAG_PREFIX }}
                #
                #tag on release, and a nightly build for 'dev'
                tags: |
                  type=raw,value=nightly,enable={{is_default_branch}}
                  type=ref,event=tag
                  type=semver,pattern={{version}}
                  type=semver,pattern={{major}}.{{minor}}
                  type=semver,pattern={{major}}
            - 
              name: Build Docker image
              uses: docker/build-push-action@v5
              with:
                file: warp.Dockerfile
                context: ./
                push: true
                tags: ${{ steps.meta.outputs.tags }}
                labels: ${{ steps.meta.outputs.labels }}
                
    build-docker-release:
        name: Build image on release
        if: ${{ github.event_name == 'release' }}
        runs-on: ubuntu-latest
        permissions:
            contents: read
            packages: write
        steps:
            -
              name: Checkout repo
              uses: actions/checkout@v4
              with:
                submodules: recursive
            - 
              name: Log into registry ${{ env.REGISTRY }}
              uses: docker/login-action@v3
              with:
                registry: ${{ env.REGISTRY }}
                username: ${{ github.actor }}
                password: ${{ secrets.GIT_MASTER_TOKEN }}
            - 
              name: Extract Container metadata
              id: meta
              uses: docker/metadata-action@v5
              with:
                images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}/${{ env.BASE_TAG_PREFIX }}
                #
                #tag on release, and a nightly build for 'dev'
                tags: |
                  type=raw,value=nightly,enable={{is_default_branch}}
                  type=ref,event=tag
                  type=semver,pattern={{version}}
                  type=semver,pattern={{major}}.{{minor}}
                  type=semver,pattern={{major}}
            - 
              name: Build Docker image
              uses: docker/build-push-action@v5
              with:
                file: warp.Dockerfile
                context: ./
                push: true
                tags: ${{ steps.meta.outputs.tags }}
                labels: ${{ steps.meta.outputs.labels }}
                
    build-warp-release:
      if: ${{ github.event_name == 'release' }}
      defaults:
        run:
          working-directory: moq-server
      strategy:
        fail-fast: false
        matrix:
          settings:
            - host: ubuntu-20.04
              target: x86_64-unknown-linux-gnu
              bundles: appimage
              asset_name: warp-ubuntu-amd64
            - host: windows-latest
              target: x86_64-pc-windows-msvc
              bundles: msi
              asset_name: warp-windows-amd64
            - host: macos-latest
              target: x86_64-apple-darwin
              bundles: dmg
              asset_name: warp-macos-amd64
            - host: macos-latest
              target: aarch64-apple-darwin
              bundles: dmg
              asset_name: warp-macos-apple-silicon
            # - host: ubuntu-20.04
            #   target: x86_64-unknown-linux-musl
            # - host: ubuntu-20.04
            #   target: aarch64-unknown-linux-gnu
            # - host: ubuntu-20.04
            #   target: aarch64-unknown-linux-musl
            # - host: ubuntu-20.04
            #   target: armv7-unknown-linux-gnueabihf
      name: Build warp on release
      runs-on: ${{ matrix.settings.host }}
      steps:
        - name: Checkout repository
          uses: actions/checkout@v4
          with:
            submodules: recursive

        - name: Install Rust
          id: toolchain
          uses: dtolnay/rust-toolchain@stable
          with:
            targets: ${{ matrix.settings.target }}
            toolchain: stable
            components: clippy, rustfmt

        - name: Cache Rust Dependencies
          uses: Swatinem/rust-cache@v2
          with:
            save-if: false
            prefix-key: 'v0-rust-deps'
            shared-key: ${{ matrix.settings.target }}

        - name: Cargo build
          run: cargo build --target ${{ matrix.settings.target }} --manifest-path ./moq-pub/Cargo.toml --release

        - name: Copy and rename artifacts (Linux)
          if: ${{ matrix.settings.host == 'ubuntu-20.04' }}
          run: |
            cp target/${{ matrix.settings.target }}/release/moq-pub ./warp
      
        - name: Copy and rename artifacts (Windows)
          if: ${{ matrix.settings.host == 'windows-latest' }}
          run: |
            cp "target/${{ matrix.settings.target }}/release/moq-pub.exe" ./warp.exe
          
        - name: Copy and rename artifacts (macOS)
          if: ${{ matrix.settings.host == 'macos-latest' }}
          run: |
            cp target/${{ matrix.settings.target }}/release/moq-pub ./warp
        
        - name: Publish release for (${{ matrix.settings.host }})
          if: ${{ matrix.settings.host == 'windows-latest' }}
          uses: svenstaro/upload-release-action@2.9.0
          with: 
            repo_token: ${{ secrets.GITHUB_TOKEN  }}
            file: ./moq-server/warp.exe
            asset_name:  ${{ matrix.settings.asset_name }}
            tag: ${{ github.ref }}
      
        - name: Publish release for (${{ matrix.settings.host }})
          if: ${{ matrix.settings.host != 'windows-latest' }}
          uses: svenstaro/upload-release-action@2.9.0
          with: 
            repo_token: ${{ secrets.GITHUB_TOKEN  }}
            file: ./moq-server/warp
            asset_name:  ${{ matrix.settings.asset_name }}
            tag: ${{ github.ref }}