name: Linters-PR

on:
  push:
    branches-ignore:
      - 'master'
  pull_request:
    branches-ignore:
      - 'master'

jobs:
  build:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        python-version: ["3.7", "3.8", "3.9", "3.10", "3.11", "3.12"]
    steps:
    - name: Checkout
      uses: actions/checkout@v4
      with:
        fetch-depth: 0
    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@v5
      with:
        python-version: ${{ matrix.python-version }}
    - name: Install dependencies
      run: |
        python -m pip install --upgrade pip
        pip install -r requirements.txt
        pip install pylint
        pip install mypy
        pip install wemake-python-styleguide
        pip install black
        pip install types-xmltodict
        pip install types-requests
        pip install pytest
        pip install faker
        pip install pillow
    - name: Add 'testrail_api_reporter' to PYTHONPATH
      run: echo "PYTHONPATH=$PYTHONPATH:$(pwd)/testrail_api_reporter:." >> $GITHUB_ENV
    - name: Analysing the code with pylint
      id: pylint
      continue-on-error: true
      run: |
        changed_files=$(git diff --diff-filter=d --name-only $(git merge-base HEAD origin/master) HEAD | grep '\.py$') || true
        echo $changed_files
        if [ -n "$changed_files" ]; then
            pylint $changed_files
        else
            echo "No files changed, passing by"
            exit 0
        fi
    - name: Analysing the code with mypy
      id: mypy
      continue-on-error: true
      run: |
        changed_files=$(git diff --diff-filter=d --name-only $(git merge-base HEAD origin/master) HEAD | grep '\.py$') || true
        echo $changed_files
        if [ -n "$changed_files" ]; then
            mkdir -p .mypy_cache
            mypy $changed_files --install-types --non-interactive --ignore-missing-imports --explicit-package-bases
        else
            echo "No files changed, passing by"
            exit 0
        fi
    - name: Check code with flake8
      id: flake8
      continue-on-error: true
      run: |
        changed_files=$(git diff --diff-filter=d --name-only $(git merge-base HEAD origin/master) HEAD | grep '\.py$') || true
        echo $changed_files
        if [ -n "$changed_files" ]; then
          flake8 $changed_files
        else
          echo "No files changed, passing by"
          exit 0
        fi
    - name: Check code with Black
      id: black
      continue-on-error: true
      run: |
        changed_files=$(git diff --diff-filter=d --name-only $(git merge-base HEAD origin/master) HEAD | grep '\.py$') || true
        echo $changed_files
        if [ -n "$changed_files" ]; then
            black --diff --check --color $changed_files
        else
            echo "No files changed, passing by"
            exit 0
        fi
    - name: Check runner state
      run: |
        failed_steps=()
        if [[ "${{ steps.pylint.outcome }}" == "failure" ]]; then failed_steps+=("Pylint"); fi
        if [[ "${{ steps.black.outcome }}" == "failure" ]]; then failed_steps+=("Black"); fi
        if [[ "${{ steps.mypy.outcome }}" == "failure" ]]; then failed_steps+=("Mypy"); fi
      
        if [ ${#failed_steps[@]} -ne 0 ]; then
          echo "Failed: ${failed_steps[*]}"
          exit 1
        else
          echo "All passed, well done, bro!"
        fi
