name: stream_flutter_workflow

env:
  ACTIONS_ALLOW_UNSECURE_COMMANDS: 'true'
  flutter_version: "3.10.4"

on:
  pull_request:
    paths:
      - 'packages/**'
      - '.github/workflows/stream_flutter_workflow.yml'
    types:
      - opened
      - reopened
      - synchronize
      - ready_for_review
  push:
    branches:
      - master
      - develop

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

jobs:
  analyze:
    timeout-minutes: 15
    if: github.event.pull_request.draft == false
    runs-on: ubuntu-latest
    steps:
      - name: "Git Checkout"
        uses: actions/checkout@v3
        with:
          fetch-depth: 0
      - name: "Install Flutter"
        uses: subosito/flutter-action@v2
        with:
          cache: true
          flutter-version: ${{ env.flutter_version }}
      - name: "Install Tools"
        run: |
          flutter pub global activate melos
      - name: "Bootstrap Workspace"
        run: melos bootstrap --verbose
      - name: "Dart Analyze"
        run: |
          melos run analyze
      - name: "Pub Check"
        if: github.base_ref == 'master'
        run: |
          melos run lint:pub

  format:
    runs-on: ubuntu-latest
    if: github.event.pull_request.draft == false
    timeout-minutes: 15
    steps:
      - name: "Git Checkout"
        uses: actions/checkout@v3
        with:
          fetch-depth: 0
      - name: "Install Flutter"
        uses: subosito/flutter-action@v2
        with:
          cache: true
          flutter-version: ${{ env.flutter_version }}
      - name: "Install Tools"
        run: |
          flutter pub global activate melos
      - name: "Bootstrap Workspace"
        run: melos bootstrap
      - name: "Melos Format"
        run: melos run format
      - name: "Validate Formatting"
        run: |
          ./.github/workflows/scripts/validate-formatting.sh

  test:
    runs-on: ubuntu-latest
    if: github.event.pull_request.draft == false
    timeout-minutes: 30
    steps:
      - name: "Git Checkout"
        uses: actions/checkout@v3
        with:
          fetch-depth: 0
      - name: "Install Flutter"
        uses: subosito/flutter-action@v2
        with:
          cache: true
          flutter-version: ${{ env.flutter_version }}
      - name: "Install Tools"
        run: |
          flutter pub global activate melos
          flutter pub global activate remove_from_coverage
      - name: "Bootstrap Workspace"
        run: melos bootstrap
      - name: "Flutter Test"
        run: melos run test:all
      - name: "Collect Coverage"
        run: melos run coverage:ignore-file --no-select
      - name: "Upload Coverage"
        uses: codecov/codecov-action@v3
        with:
          token: ${{secrets.CODECOV_TOKEN}}
          files: packages/*/coverage/lcov.info
      - name: "Stream Chat Coverage Check"
        uses: VeryGoodOpenSource/very_good_coverage@v2.1.0
        with:
          path: packages/stream_chat/coverage/lcov.info
          min_coverage: 79
      - name: "Stream Chat Localizations Coverage Check"
        uses: VeryGoodOpenSource/very_good_coverage@v2.1.0
        with:
          path: packages/stream_chat_localizations/coverage/lcov.info
          min_coverage: 100
      - name: "Stream Chat Persistence Coverage Check"
        uses: VeryGoodOpenSource/very_good_coverage@v2.1.0
        with:
          path: packages/stream_chat_persistence/coverage/lcov.info
          min_coverage: 95
      - name: "Stream Chat Flutter Core Coverage Check"
        uses: VeryGoodOpenSource/very_good_coverage@v2.1.0
        with:
          path: packages/stream_chat_flutter_core/coverage/lcov.info
          min_coverage: 30
      - name: "Stream Chat Flutter Coverage Check"
        uses: VeryGoodOpenSource/very_good_coverage@v2.1.0
        with:
          path: packages/stream_chat_flutter/coverage/lcov.info
          min_coverage: 44

  draft-build:
    runs-on: ubuntu-latest
    if: github.event.pull_request.draft == true
    timeout-minutes: 1

    steps:
      - name: Run a one-line script
        run: echo Draft PR, you are good.
