on:
  push:
    branches:
      - master
      - develop
    tags:
      - "*"
  pull_request:

jobs:
  tests:
    name: ${{ matrix.os }} ${{ matrix.compiler }}${{ matrix.clang-version }} ${{ matrix.cppstd }} Python ${{ matrix.python-version }} Epic ${{ matrix.castxml-epic }}
    runs-on: ${{ matrix.os }}

    strategy:
      fail-fast: false
      matrix:
        include:
          # UBUNTU 22.04 - CASTXML EPIC 0
          - os: ubuntu-22.04
            arch: x86_64
            compiler: clang++
            clang-version: 13
            python-version: "3.13"
            castxml-epic: 0
            cppstd: "-std=c++98"
          
          - os: ubuntu-22.04
            arch: x86_64
            compiler: clang++
            clang-version: 14
            python-version: "3.13"
            castxml-epic: 0
            cppstd: "-std=c++98"

          - os: ubuntu-22.04
            arch: x86_64
            compiler: clang++
            clang-version: 15
            python-version: "3.13"
            castxml-epic: 0
            cppstd: "-std=c++98"

          - os: ubuntu-22.04
            arch: x86_64
            compiler: clang++
            clang-version: 15
            python-version: "3.13"
            castxml-epic: 1
            cppstd: "-std=c++98"
  
          # UBUNTU 24.04 - CASTXML EPIC 0
          - os: ubuntu-24.04
            arch: x86_64
            compiler: clang++
            clang-version: 16
            python-version: "3.9"
            castxml-epic: 0
            cppstd: "-std=c++98"

          - os: ubuntu-24.04
            arch: x86_64
            compiler: clang++
            clang-version: 16
            python-version: "3.10"
            castxml-epic: 0
            cppstd: "-std=c++98"

          - os: ubuntu-24.04
            arch: x86_64
            compiler: clang++
            clang-version: 16
            python-version: "3.11"
            castxml-epic: 0
            cppstd: "-std=c++98"

          - os: ubuntu-24.04
            arch: x86_64
            compiler: clang++
            clang-version: 16
            python-version: "3.12"
            castxml-epic: 0
            cppstd: "-std=c++98"

          - os: ubuntu-24.04
            arch: x86_64
            compiler: clang++
            clang-version: 16
            python-version: "3.13"
            castxml-epic: 0
            cppstd: "-std=c++98"

          # UBUNTU 24.04 - CASTXML EPIC 0 - c++XX
          - os: ubuntu-24.04
            arch: x86_64
            compiler: clang++
            clang-version: 16
            python-version: "3.13"
            castxml-epic: 0
            cppstd: "-std=c++11"

          - os: ubuntu-24.04
            arch: x86_64
            compiler: clang++
            clang-version: 16
            python-version: "3.13"
            castxml-epic: 0
            cppstd: "-std=c++14"

          - os: ubuntu-24.04
            arch: x86_64
            compiler: clang++
            clang-version: 16
            python-version: "3.13"
            castxml-epic: 0
            cppstd: "-std=c++17"

          # UBUNTU 24.04 - CASTXML EPIC 1
          - os: ubuntu-24.04
            arch: x86_64
            compiler: clang++
            clang-version: 16
            python-version: "3.13"
            castxml-epic: 1
            cppstd: "-std=c++98"

          - os: ubuntu-24.04
            arch: x86_64
            compiler: clang++
            clang-version: 16
            python-version: "3.13"
            castxml-epic: 1
            cppstd: "-std=c++11"

          # UBUNTU ARM
          - os: ubuntu-22.04-arm
            arch: aarch64
            compiler: clang++
            clang-version: 15
            python-version: "3.13"
            castxml-epic: 0
            cppstd: "-std=c++17"

          - os: ubuntu-24.04-arm
            arch: aarch64
            compiler: clang++
            clang-version: 16
            python-version: "3.13"
            castxml-epic: 0
            cppstd: "-std=c++17"

          # UBUNTU 24.04 - CASTXML EPIC 1
          - os: ubuntu-24.04-arm
            arch: aarch64
            compiler: clang++
            clang-version: 16
            python-version: "3.13"
            castxml-epic: 1
            cppstd: "-std=c++11"

          # MACOS
          - os: macos-13
            compiler: clang++
            python-version: "3.13"
            castxml-epic: 0

          - os: macos-15
            compiler: clang++
            python-version: "3.13"
            castxml-epic: 0

    steps:
      - uses: actions/checkout@v4

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

      - name: Display Python version
        run: python -c "import sys; print(sys.version)"

      - name: Install Python lib and test libs
        run: |
          pip install '.[test]'

      - name: Run pycodestyle
        run: pycodestyle . --exclude=docs

      - name: Write xml_generator.cfg
        if: contains(matrix.os, 'ubuntu')
        run: |
          echo "[xml_generator]" > tests/xml_generator.cfg
          echo "compiler_path=/usr/bin/${{ matrix.compiler }}-${{ matrix.clang-version }}" >> tests/xml_generator.cfg
          echo "ccflags=${{ matrix.cppstd }}" >> tests/xml_generator.cfg

      # ─── Setup CastXML for Linux x86_64 ──────────────────────────────
      - name: Setup CastXML for Linux x86_64 (Ubuntu 24.04)
        if: matrix.os == 'ubuntu-24.04' && matrix.arch == 'x86_64'
        run: |
          wget -q -O ~/castxml-ubuntu-24.04-x86_64.tar.gz https://github.com/CastXML/CastXMLSuperbuild/releases/download/v0.6.11.post2/castxml-ubuntu-24.04-x86_64.tar.gz
          tar -xzf ~/castxml-ubuntu-24.04-x86_64.tar.gz -C ~/
          chmod +x ~/castxml/bin/castxml

      - name: Setup CastXML for Linux x86_64 (Ubuntu 22.04)
        if: matrix.os == 'ubuntu-22.04' && matrix.arch == 'x86_64'
        run: |
          wget -q -O ~/castxml-ubuntu-22.04-x86_64.tar.gz https://github.com/CastXML/CastXMLSuperbuild/releases/download/v0.6.11.post2/castxml-ubuntu-22.04-x86_64.tar.gz
          tar -xzf ~/castxml-ubuntu-22.04-x86_64.tar.gz -C ~/
          chmod +x ~/castxml/bin/castxml

      # ─── Setup CastXML for Linux aarch64 ──────────────────────────────
      - name: Setup CastXML for Linux aarch64 (Ubuntu 24.04)
        if: matrix.os == 'ubuntu-24.04-arm' && matrix.arch == 'aarch64'
        run: |
          wget -q -O ~/castxml-ubuntu-24.04-arm-aarch64.tar.gz https://github.com/CastXML/CastXMLSuperbuild/releases/download/v0.6.11.post2/castxml-ubuntu-24.04-arm-aarch64.tar.gz
          tar -xzf ~/castxml-ubuntu-24.04-arm-aarch64.tar.gz -C ~/
          chmod +x ~/castxml/bin/castxml

      - name: Setup CastXML for Linux aarch64 (Ubuntu 22.04)
        if: matrix.os == 'ubuntu-22.04-arm' && matrix.arch == 'aarch64'
        run: |
          wget -q -O ~/castxml-ubuntu-22.04-arm-aarch64.tar.gz https://github.com/CastXML/CastXMLSuperbuild/releases/download/v0.6.11.post2/castxml-ubuntu-22.04-arm-aarch64.tar.gz
          tar -xzf ~/castxml-ubuntu-22.04-arm-aarch64.tar.gz -C ~/
          chmod +x ~/castxml/bin/castxml

      # ─── Setup CastXML for MacOS ──────────────────────────────
      - name: Setup CastXML for macOS (arm64)
        if: matrix.os == 'macos-15'
        run: |
          wget -q -O ~/castxml-macos-15-arm64.tar.gz https://github.com/CastXML/CastXMLSuperbuild/releases/download/v0.6.11.post2/castxml-macos-15-arm64.tar.gz
          tar -xzf ~/castxml-macos-15-arm64.tar.gz -C ~/
          chmod +x ~/castxml/bin/castxml

      - name: Setup CastXML for macOS (x86_64)
        if: matrix.os == 'macos-13'
        run: |
          wget -q -O ~/castxml-macos-13-x86_64.tar.gz https://github.com/CastXML/CastXMLSuperbuild/releases/download/v0.6.11.post2/castxml-macos-13-x86_64.tar.gz
          tar -xzf ~/castxml-macos-13-x86_64.tar.gz -C ~/
          chmod +x ~/castxml/bin/castxml

      - name: Run tests
        run: |
          export PATH=~/castxml/bin:$PATH
          pytest tests

  build:
    name: Build distribution 📦
    if: startsWith(github.ref, 'refs/tags/')  # only publish to PyPI on tag pushes
    needs: tests
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v4
      with:
        persist-credentials: false
    - name: Set up Python
      uses: actions/setup-python@v5
      with:
        python-version: "3.x"

    - name: Install pypa/build
      run: >-
        python3 -m
        pip install
        build
        --user
    - name: Build a binary wheel and a source tarball
      run: python3 -m build
    - name: Store the distribution packages
      uses: actions/upload-artifact@v4
      with:
        name: python-package-distributions
        path: dist/

  publish-to-pypi:
    name: >-
      Publish Python 🐍 distribution 📦 to PyPI
    if: startsWith(github.ref, 'refs/tags/')  # only publish to PyPI on tag pushes
    needs:
    - build
    runs-on: ubuntu-latest
    environment:
      name: pypi
      url: https://pypi.org/p/<package-name>  # Replace <package-name> with your PyPI project name
    permissions:
      id-token: write  # IMPORTANT: mandatory for trusted publishing

    steps:
    - name: Download all the dists
      uses: actions/download-artifact@v4
      with:
        name: python-package-distributions
        path: dist/
    - name: Publish distribution 📦 to PyPI
      uses: pypa/gh-action-pypi-publish@release/v1

  github-release:
    name: >-
      Sign the Python 🐍 distribution 📦 with Sigstore
      and upload them to GitHub Release
    if: startsWith(github.ref, 'refs/tags/')  # only publish to PyPI on tag pushes
    needs:
    - publish-to-pypi
    runs-on: ubuntu-latest

    permissions:
      contents: write  # IMPORTANT: mandatory for making GitHub Releases
      id-token: write  # IMPORTANT: mandatory for sigstore

    steps:
    - name: Download all the dists
      uses: actions/download-artifact@v4
      with:
        name: python-package-distributions
        path: dist/
    - name: Sign the dists with Sigstore
      uses: sigstore/gh-action-sigstore-python@v3.0.0
      with:
        inputs: >-
          ./dist/*.tar.gz
          ./dist/*.whl
    - name: Create GitHub Release
      env:
        GITHUB_TOKEN: ${{ github.token }}
      run: >-
        gh release create
        "$GITHUB_REF_NAME"
        --repo "$GITHUB_REPOSITORY"
        --notes ""
    - name: Upload artifact signatures to GitHub Release
      env:
        GITHUB_TOKEN: ${{ github.token }}
      # Upload to GitHub Release using the `gh` CLI.
      # `dist/` contains the built packages, and the
      # sigstore-produced signatures and certificates.
      run: >-
        gh release upload
        "$GITHUB_REF_NAME" dist/**
        --repo "$GITHUB_REPOSITORY"
