name: Branches Development Workflow
on:
  pull_request:
    branches:
      - "**"
      - "!dev"
      - "!master"
  push:
    branches:
      - "**"
      - "!dev"
      - "!master"
  schedule:
    - cron: "0 0 * * *"

permissions:
  contents: read
  checks: write
  pull-requests: write

jobs:
  lint:
    name: Lint PyFunceble

    runs-on: "${{ matrix.os }}"

    strategy:
      fail-fast: false
      matrix:
        python_version:
          - "3.12"
        os:
          - ubuntu-latest

    steps:
      - uses: actions/checkout@v6
        name: Clone repository

      - name: Set up Python ${{ matrix.python_version }}
        uses: actions/setup-python@v6
        with:
          python-version: ${{ matrix.python_version }}

      - name: Install dependencies
        run: |
          pip install --upgrade pip
          pip install .[test,dev]

      - name: Lint PyFunceble with Pylint
        run: pylint PyFunceble

      - name: Lint tests with Pylint
        run: pylint tests

  sec_check:
    name: Check the safety of PyFunceble

    runs-on: "${{ matrix.os }}"

    strategy:
      fail-fast: false
      matrix:
        python_version:
          - "3.12"
        os:
          - ubuntu-latest

    steps:
      - uses: actions/checkout@v6
        name: Clone repository

      - name: Set up Python ${{ matrix.python_version }}
        uses: actions/setup-python@v6
        with:
          python-version: ${{ matrix.python_version }}

      - name: Install dependencies
        run: |
          pip install --upgrade pip
          pip install .[test,dev]

      - name: Check the safety of the codebase with Bandit
        run: bandit --ini=setup.cfg -r PyFunceble

  test:
    needs: [lint,sec_check]
    name: "[${{ matrix.os }}-py${{ matrix.python_version }}] Test PyFunceble"

    runs-on: "${{ matrix.os }}"

    strategy:
      fail-fast: false
      matrix:
        python_version:
          - "3.10"
          - "3.11"
          - "3.12"
          - "3.13"
        os:
          - ubuntu-latest
          - macos-latest
          - windows-latest

    steps:
      - uses: actions/checkout@v6
        name: Clone repository

      - name: Set up Python ${{ matrix.python_version }}
        uses: actions/setup-python@v6
        with:
          python-version: ${{ matrix.python_version }}

      - name: Install dependencies
        run: |
          pip install --upgrade pip
          pip install .[test]
          pip install coveralls

      - name: Test PyFunceble as defined by tox.ini
        run: |
          tox -c tox.ini

      - name: Upload Coverage
        continue-on-error: true
        run: |
          coveralls
        env:
          COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }}
          COVERALLS_PARALLEL: true

  coveralls:
    needs: test
    name: Finish Coveralls

    runs-on: "${{ matrix.os }}"

    strategy:
      fail-fast: false
      matrix:
        python_version:
          - "3.12"
        os:
          - ubuntu-latest

    steps:
      - name: Sending finish flag to coveralls.io
        uses: coverallsapp/github-action@v2
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          parallel-finished: true

  run_cli:
    needs: test
    name: "[${{ matrix.os }}-py${{ matrix.python_version }}] Run PyFunceble"

    runs-on: "${{ matrix.os }}"

    strategy:
      fail-fast: false
      matrix:
        python_version:
          - "3.10"
          - "3.11"
          - "3.12"
          - "3.13"
        os:
          - ubuntu-latest
          - windows-latest

    steps:
      - uses: actions/checkout@v6
        name: Clone repository

      - name: Set up Python ${{ matrix.python_version }}
        uses: actions/setup-python@v6
        with:
          python-version: ${{ matrix.python_version }}

      - name: Install dependencies
        run: |
          pip install --upgrade pip
          pip install .[test]

      - name: Run PyFunceble as defined by tox_run.ini
        run: tox -c tox_run.ini

  run_cli_mariadb:
    needs: test
    name: "[${{ matrix.os }}-py${{ matrix.python_version }}] Run PyFunceble (with mariadb)"

    runs-on: "${{ matrix.os }}"

    services:
      mariadb:
        image: ghcr.io/pyfunceble/mariadb/mariadb:latest
        ports:
          - 3306:3306
        env:
          MYSQL_USER: pyfunceble
          MYSQL_PASSWORD: my_pyfunceble_password
          MYSQL_DATABASE: pyfunceble
          MYSQL_ROOT_PASSWORD: my_awesome_root_password
        options: --health-cmd="mysqladmin ping" --health-interval=5s --health-timeout=2s --health-retries=3

    env:
      PYFUNCEBLE_DB_CHARSET: utf8mb4
      PYFUNCEBLE_DB_HOST: "127.0.0.1"
      PYFUNCEBLE_DB_NAME: pyfunceble
      PYFUNCEBLE_DB_PASSWORD: my_pyfunceble_password
      PYFUNCEBLE_DB_PORT: "3306"
      PYFUNCEBLE_DB_USERNAME: pyfunceble

    strategy:
      fail-fast: false
      matrix:
        python_version:
          - "3.10"
          - "3.11"
          - "3.12"
          - "3.13"
        os:
          - ubuntu-latest

    steps:
      - uses: actions/checkout@v6
        name: Clone repository

      - name: Set up Python ${{ matrix.python_version }}
        uses: actions/setup-python@v6
        with:
          python-version: ${{ matrix.python_version }}

      - name: Install dependencies
        run: |
          pip install --upgrade pip
          pip install .[test]

      - name: Run PyFunceble as defined by tox_run_mariadb.ini
        run: tox -c tox_run_mariadb.ini

  run_cli_postgresql:
    needs: test
    name: "[${{ matrix.os }}-py${{ matrix.python_version }}] Run PyFunceble (with postgresql)"

    runs-on: "${{ matrix.os }}"

    services:
      mariadb:
        image: postgres:latest
        ports:
          - 5432:5432
        env:
          POSTGRES_USER: pyfunceble
          POSTGRES_PASSWORD: my_pyfunceble_password
          POSTGRES_DB: pyfunceble
          MYSQL_ROOT_PASSWORD: my_awesome_root_password
        options: --health-cmd="pg_isready --host=localhost --username=pyfunceble --port=5432" --health-interval=5s --health-timeout=2s --health-retries=3

    env:
      PYFUNCEBLE_DB_CHARSET: utf8
      PYFUNCEBLE_DB_HOST: "127.0.0.1"
      PYFUNCEBLE_DB_NAME: pyfunceble
      PYFUNCEBLE_DB_PASSWORD: my_pyfunceble_password
      PYFUNCEBLE_DB_PORT: "5432"
      PYFUNCEBLE_DB_USERNAME: pyfunceble

    strategy:
      fail-fast: false
      matrix:
        python_version:
          - "3.10"
          - "3.11"
          - "3.12"
          - "3.13"
        os:
          - ubuntu-latest

    steps:
      - uses: actions/checkout@v6
        name: Clone repository

      - name: Set up Python ${{ matrix.python_version }}
        uses: actions/setup-python@v6
        with:
          python-version: ${{ matrix.python_version }}

      - name: Install dependencies
        run: |
          pip install --upgrade pip
          pip install .[psql-binary,test]

      - name: Run PyFunceble as defined by tox_run_postgresql.ini
        run: tox -c tox_run_postgresql.ini
