name: Build and upload wheels
on:
  workflow_dispatch:
  schedule:
    - cron: '0 0 * * 3'
  push:
    tags:
      - '*'

jobs:
  build_sdist:
    name: Build sdist
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v5
      - name: Get history and tags for SCM versioning to work
        run: |
          git fetch --prune --unshallow
          git fetch --depth=1 origin +refs/tags/*:refs/tags/*
      - name: Setup Python
        uses: actions/setup-python@v6
        with:
          python-version: '3.x'
      - name: Build sdist
        run: |
          pip install --upgrade pip
          pip install wheel build
          python -m build . -s
      - name: Test sdist
        run: |
          pip install pytest
          pip install dist/*.tar.gz
          cd ..
          python -m pytest enaml/tests
      - name: Store artifacts
        uses: actions/upload-artifact@v4
        with:
          name: cibw-sdist
          path: dist/*

  build_wheels:
    name: Build wheels on ${{ matrix.os }}
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [windows-latest, ubuntu-latest, macos-latest]
    steps:
      - name: Checkout
        uses: actions/checkout@v5
      - name: Get history and tags for SCM versioning to work
        run: |
          git fetch --prune --unshallow
          git fetch --depth=1 origin +refs/tags/*:refs/tags/*
      - name: Setup Python
        uses: actions/setup-python@v6
        with:
          python-version: '3.13'
      - name: Install cibuildwheel
        run: |
          python -m pip install --upgrade pip
          python -m pip install wheel cibuildwheel
      - name: Build wheels
        env:
          CIBW_BUILD: "cp310-* cp311-* cp312-* cp313-* cp314-*"
          CIBW_ARCHS_MACOS: x86_64 universal2 arm64
          CIBW_ARCHS_WINDOWS: auto64
          CIBW_TEST_REQUIRES: pytest
          CIBW_TEST_COMMAND: python -m pytest {package}/tests -v
        run: |
          python -m cibuildwheel . --output-dir dist
      - name: Store artifacts
        uses: actions/upload-artifact@v4
        with:
          name: cibw-wheels-${{ runner.os }}
          path: dist/*.whl

  publish:
    if: github.event_name == 'push'
    needs: [build_wheels, build_sdist]
    runs-on: ubuntu-latest
    environment:
      name: pypi
      url: https://pypi.org/p/enaml
    permissions:
      id-token: write
    steps:
      - name: Download all the dists
        uses: actions/download-artifact@v5.0.0
        with:
          pattern: cibw-*
          path: dist
          merge-multiple: true

      - uses: pypa/gh-action-pypi-publish@release/v1

  github-release:
    name: >-
      Sign the Python 🐍 distribution 📦 with Sigstore
      and create a GitHub Release
    runs-on: ubuntu-latest
    needs:
    - publish

    permissions:
      contents: write
      id-token: write

    steps:
    - name: Download all the dists
      uses: actions/download-artifact@v5.0.0
      with:
        pattern: cibw-*
        path: dist
        merge-multiple: true
    - name: Sign the dists with Sigstore
      uses: sigstore/gh-action-sigstore-python@v3.0.1
      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 }}'
        --generate-notes
    - name: Upload artifact signatures to GitHub Release
      env:
        GITHUB_TOKEN: ${{ github.token }}
      run: >-
        gh release upload
        '${{ github.ref_name }}' dist/**
        --repo '${{ github.repository }}'
