# This is a basic workflow to help you get started with GitHub Actions
name: TESTS Talk2KnowledgeGraphs

# Controls when the workflow will run
on:
  # Triggers the workflow on push or pull request events
  pull_request:
    branches: [ main ]
    paths:
      - 'aiagents4pharma/talk2knowledgegraphs/**'

  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

env:
  OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}

# This workflow contains jobs covering linting and code coverage (along with testing).
jobs:
  # pylint job for macos
  pylint-macos:
    # The type of runner that the job will run on
    name: pylint
    runs-on: ${{ matrix.os }}

    strategy:
        matrix:
            os: [macos-13]

    # Steps represent a sequence of tasks that will be executed as part of the job
    steps:
      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
      - uses: actions/checkout@v4

      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: 3.12

      - name: Cache files
        uses: actions/cache@v4
        id: cache
        with:
          path: |
            ${{ github.workspace }}/venv/*
          key: ${{ runner.os }}-venv

      # install requirements
      - name: Install the requirements
        if: steps.cache.outputs.cache-hit != 'true'
        working-directory: ${{ github.workspace }}
        run: |
          python3 -m venv venv
          source venv/bin/activate
          pip install --upgrade pip
          pip3 install --break-system-packages -r requirements.txt

      # pylint
      - name: Run pylint
        working-directory: ${{ github.workspace }}
        run: |
          source venv/bin/activate
          pylint --disable=R0801,R0902,W0221,W0122 aiagents4pharma/talk2knowledgegraphs

  # pylint job for ubuntu
  pylint-ubuntu:
    # The type of runner that the job will run on
    name: pylint
    runs-on: ${{ matrix.os }}

    strategy:
        matrix:
            os: [ubuntu-latest]

    # Steps represent a sequence of tasks that will be executed as part of the job
    steps:
      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
      - uses: actions/checkout@v4

      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: 3.12

      - name: Cache files
        uses: actions/cache@v4
        id: cache
        with:
          path: |
            ${{ github.workspace }}/venv/*
          key: ${{ runner.os }}-venv

      # install requirements
      - name: Install the requirements
        if: steps.cache.outputs.cache-hit != 'true'
        working-directory: ${{ github.workspace }}
        run: |
          python3 -m venv venv
          source venv/bin/activate
          pip install --upgrade pip
          pip3 install --break-system-packages -r requirements.txt

      # pylint
      - name: Run pylint
        working-directory: ${{ github.workspace }}
        run: |
          source venv/bin/activate
          pylint --disable=R0801,R0902,W0221,W0122 aiagents4pharma/talk2knowledgegraphs

  # pylint job for windows
  pylint-windows:
    # The type of runner that the job will run on
    name: pylint
    runs-on: ${{ matrix.os }}

    strategy:
        matrix:
            os: [windows-latest]

    # Steps represent a sequence of tasks that will be executed as part of the job
    steps:
      # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it
      - uses: actions/checkout@v4

      - name: Set up Python
        uses: actions/setup-python@v4
        with:
          python-version: 3.12

      - name: Cache files
        uses: actions/cache@v4
        id: cache
        with:
          path: |
            ${{ github.workspace }}\venv\*
          key: ${{ runner.os }}-venv

      # install requirements
      - name: Install the requirements
        if: steps.cache.outputs.cache-hit != 'true'
        working-directory: ${{ github.workspace }}
        run: |
          python3 -m venv venv
          venv\Scripts\activate
          pip install --upgrade pip
          pip3 install --break-system-packages -r requirements.txt

      # pylint
      - name: Run pylint
        working-directory: ${{ github.workspace }}
        run: |
          venv\Scripts\activate
          pylint --disable=R0801,R0902,W0221,W0122 aiagents4pharma/talk2knowledgegraphs

  # code coverage job for macos
  code-cov-macos:
    name: code-coverage
    needs: pylint-macos
    runs-on: ${{ matrix.os }}

    strategy:
        matrix:
          os: [macos-13]

    steps:
    - name: Checkout code
      uses: actions/checkout@v4

    - name: Set up Python
      uses: actions/setup-python@v4
      with:
        python-version: 3.12

    - name: Cache venv
      uses: actions/cache@v4
      id: cache_venv
      with:
        path: |
          ${{ github.workspace }}/venv/*
        key: ${{ runner.os }}-venv

    - name: Cache Ollama models
      uses: actions/cache@v4
      id: cache_ollama
      with:
        path: |
          /Users/runner/.ollama/models/*
        key: ${{ runner.os }}-ollama

    - name: Install and Pull Ollama models
      if: steps.cache_ollama.outputs.cache-hit != 'true'
      working-directory: ${{ github.workspace }}
      run: |
        source venv/bin/activate
        brew install ollama
        ollama serve &
        sleep 10
        ollama pull llama3.2:1b
        ollama list

    - name: Reading cached Ollama models
      working-directory: ${{ github.workspace }}
      run: |
        echo "Cache Hit Status - ${{ steps.cache_ollama.outputs.cache-hit }}"
        source venv/bin/activate
        brew install ollama
        ollama serve &
        sleep 10
        ollama list

    - name: Run tests with coverage
      working-directory: ${{ github.workspace }}
      run: |
        source venv/bin/activate
        coverage run --include=aiagents4pharma/talk2knowledgegraphs/* -m pytest --cache-clear aiagents4pharma/talk2knowledgegraphs/tests/

    - name: Check coverage
      working-directory: ${{ github.workspace }}
      run: |
        source venv/bin/activate
        coverage report -m
        TOTAL_COVERAGE=$(coverage report -m | awk 'END {print int($NF)}')
        if [[ $TOTAL_COVERAGE -ne 100 ]]; then
          echo "Code coverage is not 100%. Please check the coverage report."
          exit 1
        fi
      env:
        COVERAGE_FILE: './.coverage'

  # code coverage job for ubuntu
  code-cov-ubuntu:
    name: code-coverage
    needs: pylint-ubuntu
    runs-on: ${{ matrix.os }}

    strategy:
        matrix:
          os: [ubuntu-latest]

    steps:
    - name: Checkout code
      uses: actions/checkout@v4

    - name: Set up Python
      uses: actions/setup-python@v4
      with:
        python-version: 3.12

    - name: Cache venv
      uses: actions/cache@v4
      id: cache_venv
      with:
        path: |
          ${{ github.workspace }}/venv/*
        key: ${{ runner.os }}-venv

    - name: Cache Ollama models
      uses: actions/cache@v4
      id: cache_ollama
      with:
        path: |
          /usr/share/ollama/.ollama/models/*
          test
        key: ${{ runner.os }}-ollama

    - name: Install and Pull Ollama models
      if: steps.cache_ollama.outputs.cache-hit != 'true'
      working-directory: ${{ github.workspace }}
      run: |
        mkdir test
        echo "Hello, World!" > test/hello.txt
        source venv/bin/activate
        curl -fsSL https://ollama.com/install.sh | sh
        ollama serve &
        sleep 10
        ollama pull llama3.2:1b
        ls -l ~/.ollama/
        ls -l /usr/share/ollama/.ollama/

    - name: Reading cached Ollama models
      working-directory: ${{ github.workspace }}
      run: |
        cat test/hello.txt
        echo "Cache Hit Status - ${{ steps.cache_ollama.outputs.cache-hit }}"
        source venv/bin/activate
        curl -fsSL https://ollama.com/install.sh | sh
        ollama serve &
        sleep 10
        mkdir -p ~/.ollama/models/
        cp -r /usr/share/ollama/.ollama/models/* ~/.ollama/models/
        ollama list
        du -sh ~/.ollama/
        du -sh /usr/share/ollama/.ollama/

    - name: Run tests with coverage
      working-directory: ${{ github.workspace }}
      run: |
        source venv/bin/activate
        coverage run --include=aiagents4pharma/talk2knowledgegraphs/* -m pytest --cache-clear aiagents4pharma/talk2knowledgegraphs/tests/

    - name: Check coverage
      working-directory: ${{ github.workspace }}
      run: |
        source venv/bin/activate
        coverage report -m
        TOTAL_COVERAGE=$(coverage report -m | awk 'END {print int($NF)}')
        if [[ $TOTAL_COVERAGE -ne 100 ]]; then
          echo "Code coverage is not 100%. Please check the coverage report."
          exit 1
        fi
      env:
        COVERAGE_FILE: './.coverage'

  # code coverage job for windows
  code-cov-windows:
    name: code-coverage
    needs: pylint-windows
    runs-on: ${{ matrix.os }}

    strategy:
        matrix:
          os: [windows-latest]

    steps:
    - name: Checkout code
      uses: actions/checkout@v4

    - name: Set up Python
      uses: actions/setup-python@v4
      with:
        python-version: 3.12

    - name: Cache venv
      uses: actions/cache@v4
      id: cache_venv
      with:
        path: |
          ${{ github.workspace }}\venv\*
        key: ${{ runner.os }}-venv

    - name: Cache Ollama models
      uses: actions/cache@v4
      id: cache_ollama
      with:
        path: |
          C:\Users\runneradmin\.ollama\models
        key: ${{ runner.os }}-ollama

    - name: Install and Pull Ollama models
      if: steps.cache_ollama.outputs.cache-hit != 'true'
      working-directory: ${{ github.workspace }}
      run: |
        venv\Scripts\activate
        curl -L https://ollama.com/download/ollama-windows-amd64.zip -o ollama-windows-amd64.zip
        tar -xzf .\ollama-windows-amd64.zip
        start ollama serve
        sleep 10
        cmd /k ollama pull llama3.2:1b
        cmd /k ollama list

    - name: Reading cached Ollama models
      working-directory: ${{ github.workspace }}
      run: |
        echo "Cache Hit Status - ${{ steps.cache_ollama.outputs.cache-hit }}"
        venv\Scripts\activate
        curl -L https://ollama.com/download/ollama-windows-amd64.zip -o ollama-windows-amd64.zip
        tar -xzf .\ollama-windows-amd64.zip
        start ollama serve
        sleep 10
        cmd /k ollama list

    - name: Run tests with coverage
      working-directory: ${{ github.workspace }}
      run: |
        venv\Scripts\activate
        coverage run --include=aiagents4pharma/talk2knowledgegraphs/* -m pytest --cache-clear aiagents4pharma/talk2knowledgegraphs/tests/

    - name: Check coverage
      working-directory: ${{ github.workspace }}
      run: |
        venv\Scripts\activate
        coverage report -m
        # $TOTAL_COVERAGE=(& coverage report -m | Select-Object -Last 1) -replace "[^\d]"  # Extract the last line and remove non-numeric characters
        $TOTAL_COVERAGE=(& coverage report -m | Select-Object -Last 1)
        # split and extract the last element
        $TOTAL_COVERAGE=($TOTAL_COVERAGE -split " ")[-1]
        # remove non-numeric characters
        $TOTAL_COVERAGE=($TOTAL_COVERAGE -replace "[^\d]")
        # convert to int
        $TOTAL_COVERAGE=[int]$TOTAL_COVERAGE
        echo "Total coverage: $TOTAL_COVERAGE"
        if ($TOTAL_COVERAGE -ne 100) {
          Write-Host "Code coverage is not 100%. Please check the coverage report."
          exit 1
        }
      env:
        COVERAGE_FILE: './.coverage'
