name: "Go CI"
on:
  push:
    branches:
      - master
      - 'dev-*'
  workflow_dispatch:

  pull_request:
    paths-ignore:
      - '**.yml'
      - '**.md'

jobs:
  lint:
    name: Lint
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v5

      - name: Set up Go 1.25
        uses: actions/setup-go@v6
        with:
          go-version: "1.25"

      - name: Lint
        uses: golangci/golangci-lint-action@v8
        with:
          version: v2.5
          args: --timeout=20m --disable=errcheck

      - name: Format
        run: make fmt check_changes

  check:
    name: Check
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v5

      - name: Set up Go 1.25
        uses: actions/setup-go@v6
        with:
          go-version: "1.25"

      - name: Check Go modules
        run: make go_mod check_changes

      - name: Check translations
        run: make check-tr

  test-db:
    name: Test
    strategy:
      fail-fast: false
      matrix:
        os: ["ubuntu-latest"]
        go: ["1.25"]
        database: [postgres, mysql]
        include:
          - database: postgres
            image: postgres:16
            port: 5432:5432
          - database: mysql
            image: mysql:8
            port: 3306:3306

    runs-on: ${{ matrix.os }}
    services:
      database:
        image: ${{ matrix.image }}
        ports:
          - ${{ matrix.port }}
        env:
          POSTGRES_PASSWORD: opengist
          POSTGRES_DB: opengist_test
          MYSQL_ROOT_PASSWORD: opengist
          MYSQL_DATABASE: opengist_test
        options: >-
          --health-cmd ${{ matrix.database == 'postgres' && 'pg_isready' || '"mysqladmin ping"' }}
          --health-interval 10s
          --health-timeout 5s
          --health-retries 5
    steps:
      - name: Checkout
        uses: actions/checkout@v5

      - name: Set up Go ${{ matrix.go }}
        uses: actions/setup-go@v6
        with:
          go-version: ${{ matrix.go }}

      - name: Run tests
        run: make test TEST_DB_TYPE=${{ matrix.database }}

  test:
    name: Test
    strategy:
      fail-fast: false
      matrix:
        os: ["ubuntu-latest", "macOS-latest", "windows-latest"]
        go: ["1.25"]
        database: ["sqlite"]
    runs-on: ${{ matrix.os }}
    steps:
      - name: Checkout
        uses: actions/checkout@v5

      - name: Set up Go ${{ matrix.go }}
        uses: actions/setup-go@v6
        with:
          go-version: ${{ matrix.go }}

      - name: Run tests
        run: make test TEST_DB_TYPE=${{ matrix.database }}

  build:
    name: Build
    strategy:
      fail-fast: false
      matrix:
        os: ["ubuntu-latest", "macOS-latest", "windows-latest"]
        go: ["1.25"]
    runs-on: ${{ matrix.os }}
    steps:
      - name: Checkout
        uses: actions/checkout@v5

      - name: Set up Go 1.25
        uses: actions/setup-go@v6
        with:
          go-version: ${{ matrix.go }}

      - name: Build
        shell: bash
        run: make
