name: CI
on:
  push:
    branches:
      - '*'
    tags:
      - 'v*'
  pull_request:

env:
  CARGO_INCREMENTAL: 0

jobs:
  tests:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        database:
          - postgres
          - sqlite
    env:
      DATABASE: ${{ matrix.database }}
    steps:
      -
        name: Checkout
        uses: actions/checkout@v4
      - 
        name: Install Nix
        uses: cachix/install-nix-action@v27
        with:
          nix_path: nixpkgs=channel:nixos-24.11
      -
        name: Cargo cache
        uses: actions/cache@v4
        with:
          path: |
            ~/.cargo/bin/
            ~/.cargo/registry/index/
            ~/.cargo/registry/cache/
            ~/.cargo/git/db/
            target/
          key: ${{ runner.os }}-cargo-test-${{ matrix.database }}-${{ hashFiles('**/Cargo.lock') }}
      -
        name: Start dependency services
        run: docker compose up -d
      -
        name: Build UI
        run: nix-shell --command "make build-ui"
      -
        name: Run tests
        run: nix-shell --command "make test"

  dist:
    needs: tests
    runs-on: ubuntu-latest
    if: startsWith(github.ref, 'refs/tags/v')
    strategy:
      matrix:
        database:
          - postgres
          - sqlite
    env:
      DATABASE: ${{ matrix.database }}
    steps:
      -
        name: Checkout
        uses: actions/checkout@v4
      - 
        name: Install Nix
        uses: cachix/install-nix-action@v27
        with:
          nix_path: nixpkgs=channel:nixos-24.11
      -
        name: Cargo cache
        uses: actions/cache@v4
        with:
          path: |
            ~/.cargo/bin/
            ~/.cargo/registry/index/
            ~/.cargo/registry/cache/
            ~/.cargo/git/db/
            target/
          key: ${{ runner.os }}-cargo-dist-${{ hashFiles('**/Cargo.lock') }}
      -
        name: Build UI
        run: nix-shell --command "make build-ui"
      -
        name: Install dev dependencies
        run: nix-shell --command "make dev-dependencies"
      -
        name: Build distributables
        run: nix-shell --command "make dist"
      -
        name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: eu-west-1
      -
        name: Upload binaries to S3
        run: |
          aws s3 sync dist s3://builds.loraserver.io/chirpstack
        if: startsWith(github.ref, 'refs/tags/v')
      -
        name: Docker meta
        id: meta
        uses: docker/metadata-action@v3
        with:
          images: |
            chirpstack/${{ github.event.repository.name }}${{ matrix.database != 'postgres' && format('-{0}', matrix.database) || '' }}
          tags: |
            type=semver,pattern={{version}}
            type=semver,pattern={{major}}
            type=semver,pattern={{major}}.{{minor}}
      -
        name: Set up QEMU
        uses: docker/setup-qemu-action@v1
      -
        name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v1
        with:
          config: .github/buildkitd.toml
      -
        name: Login to DockerHub
        uses: docker/login-action@v1 
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}
      -
        name: Build and push
        id: docker_build
        uses: docker/build-push-action@v2
        with:
          context: .
          push: ${{ startsWith(github.ref, 'refs/tags/v') }}
          platforms: linux/amd64,linux/arm/v7,linux/arm64
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
      -
        name: Image digest
        run: echo ${{ steps.docker_build.outputs.digest }}
