# SPDX-License-Identifier: GPL-3.0-or-later
# SPDX-FileCopyrightText: 2020-2024 Carles Fernandez-Prades <carles.fernandez@cttc.es>
name: Simple CI

on:
  pull_request:
    paths-ignore:
      - "**/CITATION.cff"
  push:
    paths-ignore:
      - "**/CITATION.cff"
  workflow_dispatch:

jobs:
  build-ubuntu:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: install dependencies
        run: |
          sudo apt update
          sudo apt install -y libunwind-dev
          sudo apt install -y --no-install-recommends ninja-build cmake \
          libboost-dev libboost-date-time-dev libboost-system-dev libboost-filesystem-dev \
          libboost-thread-dev libboost-chrono-dev libboost-serialization-dev \
          liblog4cpp5-dev gnuradio-dev gr-osmosdr libpugixml-dev libpcap-dev libblas-dev \
          liblapack-dev libarmadillo-dev libgflags-dev libgoogle-glog-dev \
          libgnutls-openssl-dev libmatio-dev googletest protobuf-compiler libprotobuf-dev \
          python3-mako liborc-0.4-dev
      - name: configure
        run: cmake -S . -B build -GNinja
      - name: build
        run: cmake --build build
      - name: check
        run: cmake --build build --target check && ./install/volk_gnsssdr_profile && ./install/run_tests
      - name: default position_test
        run: |
          cmake -S . -B build -DENABLE_SYSTEM_TESTING_EXTRA=ON -DENABLE_UNIT_TESTING_EXTRA=OFF && \
          cmake --build build && ./install/position_test && ./install/run_tests --gtest_filter=Osnma*

  build-macos:
    runs-on: macos-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          python-version: '3.12'      
      - name: install dependencies
        run: |
          brew update
          rm /usr/local/bin/2to3 || true
          rm /usr/local/bin/idle3 || true
          rm /usr/local/bin/pydoc3 || true
          rm /usr/local/bin/python3 || true
          rm /usr/local/bin/python3-config || true
          rm /usr/local/bin/2to3-3.1* || true
          rm /usr/local/bin/idle3.1* || true
          rm /usr/local/bin/pydoc3.1* || true
          rm /usr/local/bin/python3.1* || true
          export HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1
          brew link --overwrite python@3.12
          brew install ninja hdf5 automake armadillo lapack libmatio gnuradio openssl pugixml protobuf boost
          pip3 install mako
      - name: configure
        run: cmake -S . -B build -GNinja
      - name: build
        run: cmake --build build
      - name: check
        run: cmake --build build --target check && ./install/volk_gnsssdr_profile && ./install/run_tests
      - name: default position_test
        run: |
          cmake -S . -B build -DENABLE_SYSTEM_TESTING_EXTRA=ON -DENABLE_UNIT_TESTING_EXTRA=OFF && \
          cmake --build build && ./install/position_test && ./install/run_tests --gtest_filter=Osnma*

  build-macos-xcode:
    runs-on: macos-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          python-version: '3.12'
      - name: install dependencies
        run: |
          brew update
          rm /usr/local/bin/2to3 || true
          rm /usr/local/bin/idle3 || true
          rm /usr/local/bin/pydoc3 || true
          rm /usr/local/bin/python3 || true
          rm /usr/local/bin/python3-config || true
          rm /usr/local/bin/2to3-3.1* || true
          rm /usr/local/bin/idle3.1* || true
          rm /usr/local/bin/pydoc3.1* || true
          rm /usr/local/bin/python3.1* || true
          export HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1
          brew link --overwrite python@3.12
          brew install ninja pkg-config hdf5 automake armadillo lapack libmatio gnuradio openssl pugixml protobuf boost
          pip3 install mako          
      - name: configure
        run: cmake -S . -B build -GXcode
      - name: build
        run: cmake --build build --config Release
      - name: check
        run: |
          cmake --build build --config Release --target check
          ./install/volk_gnsssdr_profile
          ./install/run_tests
      - name: default position_test
        run: |
          cmake -S . -B build -DENABLE_SYSTEM_TESTING_EXTRA=ON -DENABLE_UNIT_TESTING_EXTRA=OFF
          cmake --build build --config Release --target position_test
          ./install/position_test
          ./install/run_tests --gtest_filter=Osnma*

  clang-format:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        path:
          - 'src'
          - 'tests'
          - 'utils'
    steps:
      - uses: actions/checkout@v4
      - name: run clang-format
        uses: jidicula/clang-format-action@v4.14.0
        with:
          clang-format-version: "19"
          check-path: ${{ matrix.path }}
          exclude-regex: '(libs\/gsl\/)|(tmpl)|(cpu_features)|^.*\.(cu|proto)$'

  clang-tidy:
    runs-on: macos-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          python-version: '3.12'
      - name: install dependencies
        run: |
          brew update
          rm /usr/local/bin/2to3 || true
          rm /usr/local/bin/idle3 || true
          rm /usr/local/bin/pydoc3 || true
          rm /usr/local/bin/python3 || true
          rm /usr/local/bin/python3-config || true
          rm /usr/local/bin/2to3-3.1* || true
          rm /usr/local/bin/idle3.1* || true
          rm /usr/local/bin/pydoc3.1* || true
          rm /usr/local/bin/python3.1* || true
          export HOMEBREW_NO_INSTALLED_DEPENDENTS_CHECK=1
          brew link --overwrite python@3.12
          brew install ninja pkg-config hdf5 automake armadillo lapack libmatio gnuradio openssl pugixml protobuf llvm boost
          pip3 install mako
          ln -s $(brew --prefix llvm)/bin/clang-tidy /usr/local/bin
          ln -s $(brew --prefix llvm)/bin/clang-apply-replacements /usr/local/bin
          ln -s $(brew --prefix llvm)/bin/run-clang-tidy.py /usr/local/bin
      - name: Prepare run
        run: cmake -S . -B build && cmake --build build --target volk_gnsssdr_module gtest-1.16.0 core_monitor core_libs pvt_libs
      - name: run clang-tidy
        run: cd build && /opt/homebrew/opt/llvm/bin/run-clang-tidy -fix
      - name: check
        run: |
          git diff > clang_tidy.patch
          echo -e "if \n [ -s clang_tidy.patch ] \nthen \n echo "clang_tidy not applied:"; echo ""; more clang_tidy.patch; exit 1 \nfi \n" > detect
          chmod +x ./detect
          ./detect

  cpplint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: install dependencies
        run: sudo apt install python3-pip && sudo pip3 install cpplint
      - name: run checks
        run: "find ./src/ ./utils ./tests -iname *.h -o -iname *.cc | xargs cpplint
          --filter=-,+build/class,+build/deprecated,+build/explicit_make_pair,\
          +build/forward_decl,+build/printf_format,+build/storage_class,\
          +readability/constructors,+readability/namespace,+readability/newline,\
          +readability/utf8,+runtime/casting,+runtime/explicit,\
          +runtime/indentation_namespace,+runtime/init,+runtime/invalid_increment,\
          +runtime/member_string_references,+runtime/memset,+runtime/operator,\
          +runtime/printf,+runtime/printf_format,+whitespace/blank_line,\
          +whitespace/comma,+whitespace/comments,+whitespace/empty_conditional_body,\
          +whitespace/end-of-line,+whitespace/ending-newline,+whitespace/semicolon,\
          +whitespace/tab --exclude=./src/core/interfaces/gnss_block_interface.h
          --exclude=./src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr/cpu_features/test/hwcaps_for_testing.*
          --exclude=./utils/nav-listener/build/nav_message.pb.h"

  prettier-markdown:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: install dependencies
        run: sudo npm install --global prettier
      - name: check markdown
        run: find . -iname "*.md" | xargs prettier --parser markdown --print-width 80 --prose-wrap always --list-different

  cmakelint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: install dependencies
        run: |
          sudo pip install cmakelint
      - name: check CMake scripts
        run: find . -iname "CMakeLists.txt" -o -iname "*.cmake" | xargs cmakelint --filter=-linelength,-readability/wonkycase

  volk-gnsssdr-windows:
    runs-on: windows-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          python-version: '3.13'
      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install mako
      - name: configure
        shell: powershell
        run: cmake -S src\algorithms\libs\volk_gnsssdr_module\volk_gnsssdr -B build -G "Visual Studio 17 2022"
      - name: build
        run: cmake --build build --config Release
      - name: test
        shell: powershell
        run: ctest -C Release --test-dir build
      - name: install
        run: cmake --install build
      - name: run profile
        run: cd 'C:\Program Files (x86)\volk_gnsssdr\bin'; .\volk_gnsssdr_profile.exe

  volk-gnsssdr-ubuntu:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: install dependencies
        run: sudo apt install python3-mako liborc-dev
      - name: configure
        run: cmake -S src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr -B build
      - name: build
        run: cmake --build build
      - name: install
        run: sudo cmake --install build && sudo ldconfig
      - name: test
        run: volk_gnsssdr_profile

  volk-gnsssdr-macos:
    runs-on: macos-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          python-version: '3.13'
      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install mako
      - name: configure
        run: cmake -S src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr -B build
      - name: build
        run: cmake --build build && sudo cmake --install build
      - name: test
        run: ctest -C Release --test-dir build --exclude-regex volk_gnsssdr_32fc_32f_rotator_dotprodxnpuppet_32fc

  volk-gnsssdr-macos-xcode:
    runs-on: macos-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          python-version: '3.13'
      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install mako
      - name: configure
        run: cmake -S src/algorithms/libs/volk_gnsssdr_module/volk_gnsssdr -B build -GXcode
      - name: build
        run: cmake --build build --config Release
      - name: install
        run: sudo cmake --install build
      - name: test
        run: ctest -C Release --test-dir build --exclude-regex --exclude-regex volk_gnsssdr_32fc_32f_rotator_dotprodxnpuppet_32fc

  shellcheck:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: install dependencies
        run: sudo apt install shellcheck
      - name: check scripts
        run: shellcheck utils/scripts/*

  REUSE-compliance:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Check REUSE compliance
        uses: docker://fsfe/reuse
        with:
          args: lint