name: CI

on:

pull_request:
push:
  branches: [ <%= user_default_branch %> ]

jobs: <%- unless skip_rubocop? -%>

lint:
  runs-on: ubuntu-latest
  env:
    RUBY_VERSION: <%= ENV["RBENV_VERSION"] || ENV["rvm_ruby_string"] || "#{RUBY_ENGINE}-#{RUBY_ENGINE_VERSION}" %>
    RUBOCOP_CACHE_ROOT: tmp/rubocop
  steps:
    - name: Checkout code
      uses: actions/checkout@v6

    - name: Set up Ruby
      uses: ruby/setup-ruby@v1
      with:
        ruby-version: ${{ env.RUBY_VERSION }}
        bundler-cache: true

    - name: Prepare RuboCop cache
      uses: actions/cache@v4
      env:
        DEPENDENCIES_HASH: ${{ hashFiles('**/.rubocop.yml', '**/.rubocop_todo.yml', 'Gemfile.lock') }}
      with:
        path: ${{ env.RUBOCOP_CACHE_ROOT }}
        key: rubocop-${{ runner.os }}-${{ env.RUBY_VERSION }}-${{ env.DEPENDENCIES_HASH }}-${{ github.ref_name == github.event.repository.default_branch && github.run_id || 'default' }}
        restore-keys: |
          rubocop-${{ runner.os }}-${{ env.RUBY_VERSION }}-${{ env.DEPENDENCIES_HASH }}-

    - name: Lint code for consistent style
      run: bin/rubocop -f github

<% end -%> <% unless options -%>

test:
  runs-on: ubuntu-latest

  <%- if options[:database] == "sqlite3" -%>
  # services:
  #  redis:
  #    image: valkey/valkey:8
  #    ports:
  #      - 6379:6379
  #    options: --health-cmd "redis-cli ping" --health-interval 10s --health-timeout 5s --health-retries 5
  <%- else -%>
  services:
    <%- if options[:database] == "mysql" || options[:database] == "trilogy" -%>
    mysql:
      image: mysql
      env:
        MYSQL_ALLOW_EMPTY_PASSWORD: true
      ports:
        - 3306:3306
      options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3
    <%- elsif options[:database] == "postgresql" -%>
    postgres:
      image: postgres
      env:
        POSTGRES_USER: postgres
        POSTGRES_PASSWORD: postgres
      ports:
        - 5432:5432
      options: --health-cmd="pg_isready" --health-interval=10s --health-timeout=5s --health-retries=3
    <%- end -%>

    # redis:
    #   image: valkey/valkey:8
    #   ports:
    #     - 6379:6379
    #   options: --health-cmd "redis-cli ping" --health-interval 10s --health-timeout 5s --health-retries 5

  <%- end -%>
  steps:
    - name: Checkout code
      uses: actions/checkout@v6

    - name: Set up Ruby
      uses: ruby/setup-ruby@v1
      with:
        ruby-version: <%= ENV["RBENV_VERSION"] || ENV["rvm_ruby_string"] || "#{RUBY_ENGINE}-#{RUBY_ENGINE_VERSION}" %>
        bundler-cache: true
    <%- if using_bun? -%>

    - uses: oven-sh/setup-bun@v1
      with:
        bun-version: <%= dockerfile_bun_version %>
    <%- end -%>

    - name: Run tests
      env:
        RAILS_ENV: test
        <%- if options[:database] == "mysql" -%>
        DATABASE_URL: mysql2://127.0.0.1:3306
        <%- elsif options[:database] == "trilogy" -%>
        DATABASE_URL: trilogy://127.0.0.1:3306
        <%- elsif options[:database] == "postgresql" -%>
        DATABASE_URL: postgres://postgres:postgres@localhost:5432
        <%- end -%>
        # RAILS_MASTER_KEY: ${{ secrets.RAILS_MASTER_KEY }}
        # REDIS_URL: redis://localhost:6379/0
      run: <%= test_command %>

    - name: Keep screenshots from failed system tests
      uses: actions/upload-artifact@v4
      if: failure()
      with:
        name: screenshots
        path: ${{ github.workspace }}/tmp/screenshots
        if-no-files-found: ignore

<% end -%>