name: tagpr
on:
  push:
    branches:
      - main

jobs:
  tagpr:
    runs-on: ubuntu-latest
    outputs:
      tagpr-tag: ${{ steps.run-tagpr.outputs.tag }}
    env:
      GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
    steps:
      - name: Check out source code
        uses: actions/checkout@v3

      - name: Set up Go
        uses: actions/setup-go@v3
        with:
          go-version-file: go.mod

      - id: run-tagpr
        name: Run tagpr
        uses: Songmu/tagpr@v1

  darwin-release:
    needs: tagpr
    if: needs.tagpr.outputs.tagpr-tag != ''
    runs-on: macos-latest
    env:
      GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
    steps:
      - name: Check out source code
        uses: actions/checkout@v3
        with:
          fetch-depth: 0

      - name: Set up Go
        uses: actions/setup-go@v3
        with:
          go-version-file: go.mod

      - name: Setup
        run: |
          brew install goreleaser
          brew install sqlite3

      - name: Release
        run: |
          make release_darwin

  linux-release:
    needs: tagpr
    if: needs.tagpr.outputs.tagpr-tag != ''
    runs-on: ubuntu-latest
    steps:
      - name: Install packages
        run: |
          sudo apt-get update
          sudo apt-get install sqlite3

      - name: Install aws-cli
        uses: isbang/setup-awscli@v0.1.0

      - name: Check out source code
        uses: actions/checkout@v3
        with:
          fetch-depth: 0

      - name: Set up Go on Ubuntu
        uses: actions/setup-go@v3
        with:
          go-version-file: go.mod

      - name: Start databases
        run: |
          docker compose up -d
          sleep 20s

      - name: Run GoReleaser (dry-run)
        uses: goreleaser/goreleaser-action@v2
        with:
          distribution: goreleaser
          version: latest
          args: --config .goreleaser/linux.yml --rm-dist --snapshot --skip-publish
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: Run integration test
        run: |
          env TBLS=dist/tbls-linux_linux_amd64_v1/tbls make depsdev db doc
          git restore .

      - name: Run GoReleaser
        uses: goreleaser/goreleaser-action@v2
        with:
          distribution: goreleaser
          version: latest
          args: --config .goreleaser/linux.yml --rm-dist
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

  windows-release:
    needs: tagpr
    if: needs.tagpr.outputs.tagpr-tag != ''
    runs-on: windows-2019
    steps:
      - name: Use LF
        run: |
          git config --global core.autocrlf false
          git config --global core.eol lf

      - name: Install packages
        run: |
          choco install sqlite

      - name: Install aws-cli
        uses: isbang/setup-awscli@v0.1.0

      - name: Check out source code
        uses: actions/checkout@v3
        with:
          fetch-depth: 0

      - name: Set up Go on Windows
        uses: actions/setup-go@v3
        with:
          go-version-file: go.mod

      - name: Run tests
        run: env TBLS=tbls.exe make ci_windows
        shell: bash

      - name: Run GoReleaser
        uses: goreleaser/goreleaser-action@v2
        with:
          distribution: goreleaser
          version: latest
          args: --config .goreleaser/windows.yml --rm-dist
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

  dockerimage:
    needs: tagpr
    if: needs.tagpr.outputs.tagpr-tag != ''
    runs-on: ubuntu-latest
    env:
      GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
    steps:
      - name: Check out source code
        uses: actions/checkout@v3
        with:
          fetch-depth: 0

      - name: Get latest version
        id: latest_version
        run: |
          echo -n 'version=' > $GITHUB_OUTPUT
          gh release list --limit 1 | cut -f 1 >> $GITHUB_OUTPUT
          cat $GITHUB_OUTPUT

      - name: Set up QEMU
        uses: docker/setup-qemu-action@v2

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v2

      - name: Login to Docker Hub
        uses: docker/login-action@v2
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}

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

      - name: Build and push
        uses: docker/build-push-action@v2
        with:
          context: .
          file: Dockerfile
          platforms: linux/amd64,linux/arm64
          push: true
          tags: |
            k1low/tbls:latest
            k1low/tbls:${{ steps.latest_version.outputs.version }}
            ghcr.io/k1low/tbls:latest
            ghcr.io/k1low/tbls:${{ steps.latest_version.outputs.version }}
          labels: |
            org.opencontainers.image.name=tbls
            org.opencontainers.image.revision=${{ github.sha }}
            org.opencontainers.image.version=${{ steps.latest_version.outputs.version }}
            org.opencontainers.image.source=https://github.com/k1LoW/tbls
