name: Deploy
on:
  push:
    branches: ["main"]

concurrency:
  group: ${{ github.workflow }}-${{ github.ref }}
  cancel-in-progress: true

jobs:
  lint:
    name: Lint
    runs-on: ubuntu-latest
    steps:
      - name: Check out code into the Go module directory
        uses: actions/checkout@v6
        with:
          fetch-depth: 0

      - name: Install nix
        uses: DeterminateSystems/nix-installer-action@main

      - name: Setup Nix cache
        uses: nix-community/cache-nix-action@main
        with:
          primary-key: nix-${{ runner.os }}-${{ hashFiles('**/*.nix', '**/flake.lock') }}
          restore-prefixes-first-match: nix-${{ runner.os }}-

      - name: Check formatting
        run: nix develop -c cargo fmt --check

      - name: Clippy
        run: nix develop -c cargo clippy

  test:
    name: Test
    runs-on: ubuntu-latest
    steps:
      - name: Check out code into the Go module directory
        uses: actions/checkout@v6
        with:
          fetch-depth: 0

      - name: Install nix
        uses: DeterminateSystems/nix-installer-action@main

      - name: Setup Nix cache
        uses: nix-community/cache-nix-action@main
        with:
          primary-key: nix-${{ runner.os }}-${{ hashFiles('**/*.nix', '**/flake.lock') }}
          restore-prefixes-first-match: nix-${{ runner.os }}-

      - name: Run tests
        run: |
          nix develop --command cargo test -- --show-output

  deploy:
    name: Deploy
    runs-on: ubuntu-latest
    needs:
      - lint
      - test
    steps:
      - name: Checkout
        uses: actions/checkout@v6

      - name: Install nix
        uses: DeterminateSystems/nix-installer-action@v21

      - name: Setup Nix cache
        uses: nix-community/cache-nix-action@main
        with:
          primary-key: nix-${{ runner.os }}-${{ hashFiles('**/*.nix', '**/flake.lock') }}
          restore-prefixes-first-match: nix-${{ runner.os }}-

      - name: Login to GitHub Container Registry
        uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}

      - name: Build container
        run: |
          nix build -L .#brewlog-container

      - name: Upload container to ghcr.io
        run: |
          docker load < result
          version=$(cat Cargo.toml | nix run nixpkgs#tomlq -- -r .package.version)

          docker tag "brewlog:${version}" "ghcr.io/jnsgruk/brewlog:$(git rev-parse --short HEAD)"
          docker push "ghcr.io/jnsgruk/brewlog:$(git rev-parse --short HEAD)"

          docker tag "brewlog:${version}" "ghcr.io/jnsgruk/brewlog:latest"
          docker push "ghcr.io/jnsgruk/brewlog:latest"

      - name: Deploy site
        run: |
          nix run nixpkgs#flyctl -- deploy -i "ghcr.io/jnsgruk/brewlog:$(git rev-parse --short HEAD)"
        env:
          FLY_ACCESS_TOKEN: ${{ secrets.FLY_API_TOKEN }}
