# This workflow will build a golang project
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-go

name: Go

on:
  push:
    branches: [ "*" ]
  pull_request:
    branches: [ "*" ]

jobs:
  fmt:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      
      - name: Set up Go
        uses: actions/setup-go@v5
        with:
          go-version: '1.20'

      - name: Check formatting
        run: |
          if [ -n "$(go fmt ./...)" ]; then
            echo "Some files are not properly formatted. Please run 'go fmt ./...'"
            exit 1
          fi

  test:
    strategy:
      matrix:
        os:
          - macos-latest
          - ubuntu-24.04
        llvm: [18]
    runs-on: ${{matrix.os}}
    steps:
      - uses: actions/checkout@v4

      - name: Install dependencies
        if: startsWith(matrix.os, 'macos')
        run: |
          brew uninstall pkg-config@0.29.2
          brew update
          brew install llvm@${{matrix.llvm}} pkg-config bdw-gc openssl libffi
          echo "$(brew --prefix llvm@${{matrix.llvm}})/bin" >> $GITHUB_PATH
          echo "PKG_CONFIG_PATH=/opt/homebrew/opt/libffi/lib/pkgconfig" >> $GITHUB_ENV

          # Install optional deps for demos.
          #
          # NOTE: Keep this list updated as new deps are introduced.
          opt_deps=(
            cjson       # for github.com/goplus/llgo/c/cjson
            sqlite      # for github.com/goplus/llgo/c/sqlite
            python@3.12 # for github.com/goplus/llgo/py
          )
          brew install "${opt_deps[@]}"

      - name: Install dependencies
        if: startsWith(matrix.os, 'ubuntu')
        run: |
          echo "deb http://apt.llvm.org/$(lsb_release -cs)/ llvm-toolchain-$(lsb_release -cs)-${{matrix.llvm}} main" | sudo tee /etc/apt/sources.list.d/llvm.list
          wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add -
          sudo apt-get update
          sudo apt-get install -y llvm-${{matrix.llvm}}-dev clang-${{matrix.llvm}} libclang-${{matrix.llvm}}-dev lld-${{matrix.llvm}} pkg-config libgc-dev libssl-dev zlib1g-dev libffi-dev libcjson-dev
          echo "/usr/lib/llvm-${{matrix.llvm}}/bin" >> $GITHUB_PATH

          # Install optional deps for demos.
          #
          # NOTE: Keep this list updated as new deps are introduced.
          opt_deps=(
            libcjson-dev   # for github.com/goplus/llgo/c/cjson
            libsqlite3-dev # for github.com/goplus/llgo/c/sqlite
            python3.12-dev # for github.com/goplus/llgo/py
          )
          sudo apt-get install -y "${opt_deps[@]}"

      - name: Install further optional dependencies for demos
        run: |
          wget -P ./_demo/llama2-c https://huggingface.co/karpathy/tinyllamas/resolve/main/stories15M.bin
          py_deps=(
            numpy # for github.com/goplus/llgo/py/numpy
            torch # for github.com/goplus/llgo/py/torch
          )
          pip3.12 install --break-system-packages "${py_deps[@]}"

      - name: Clang information
        run: |
          echo $PATH
          which clang
          clang --version

      - name: Set up Go
        uses: actions/setup-go@v5
        with:
          go-version: '1.20'

      - name: Build
        run: go build -v ./...

      - name: Test
        if: ${{!startsWith(matrix.os, 'macos')}}
        run: go test -v ./...

      - name: Test with coverage
        if: startsWith(matrix.os, 'macos')
        run: go test -v -coverprofile="coverage.txt" -covermode=atomic ./...

      - name: Install
        run: go install ./...

      - name: LLGO tests
        if: ${{!startsWith(matrix.os, 'ubuntu')}}
        run: |
          echo "Test result on ${{matrix.os}} with LLVM ${{matrix.llvm}}" > result.md
          bash .github/workflows/test_llgo.sh
      
      - name: chore/_xtool build tests
        run: |
          cd chore/_xtool
          llgo build -v ./...
      
      - name: LLDB tests
        if: ${{startsWith(matrix.os, 'macos')}}
        run: |
          echo "Test lldb with llgo plugin on ${{matrix.os}} with LLVM ${{matrix.llvm}}"
          bash _lldb/runtest.sh -v

      - name: Test demos
        continue-on-error: true
        run: bash .github/workflows/test_demo.sh

      - name: Show test result
        run: cat result.md

      - name: PR comment with test result
        uses: thollander/actions-comment-pull-request@v3
        if: false
        with:
          filePath: result.md
          comment_tag: test-result-on-${{matrix.os}}-with-llvm-${{matrix.llvm}}

      - name: Upload coverage reports to Codecov
        uses: codecov/codecov-action@v5
        with:
          token: ${{secrets.CODECOV_TOKEN}}
          slug: goplus/llgo
