name: wheels

on:
  push:
    tags:
      - '**'

jobs:
  # First job: Build compressed BÍN data once (platform-independent)
  prepare_data:
    name: Prepare BÍN compressed data
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4
        with:
          lfs: true

      - uses: actions/setup-python@v5
        with:
          python-version: '3.11'

      - name: Fetch BÍN source data and build compressed.bin
        run: |
          pip3 install -e .
          echo "Fetching BÍN source data..."
          cd src/islenska/resources
          curl -o KRISTINsnid.csv.zip 'https://bin.arnastofnun.is/django/api/nidurhal/?file=KRISTINsnid.csv.zip'
          unzip KRISTINsnid.csv.zip
          rm KRISTINsnid.csv.*
          cd ../../..
          echo "Running binpack..."
          python3 tools/binpack.py
          echo "Running dawgbuilder..."
          python3 tools/dawgbuilder.py
          echo "Compressed data files generated:"
          ls -lh src/islenska/resources/*.bin src/islenska/resources/*.dawg.* 2>/dev/null || true

      - name: Upload compressed data artifacts
        uses: actions/upload-artifact@v4
        with:
          name: compressed-bin-data
          path: |
            src/islenska/resources/compressed.bin
            src/islenska/resources/*.dawg.*
          retention-days: 1

  # Second job: Build wheels on each platform (depends on prepare_data)
  build_wheels:
    name: Build wheels on ${{ matrix.os }}
    needs: prepare_data
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [windows-latest, macos-14, ubuntu-latest]

    steps:
      - uses: actions/checkout@v4
        with:
          lfs: true

      - uses: actions/setup-python@v5
        with:
          python-version: '3.11'

      - name: Download compressed data artifacts
        uses: actions/download-artifact@v4
        with:
          name: compressed-bin-data
          path: src/islenska/resources/

      - name: Verify downloaded artifacts
        run: |
          echo "Downloaded compressed data files:"
          ls -lh src/islenska/resources/*.bin src/islenska/resources/*.dawg.* 2>/dev/null || true
        shell: bash

      - name: Install cibuildwheel
        run: |
          python -m pip install --upgrade wheel pip cibuildwheel
          python -m pip install "setuptools<72"

      - name: Build wheels
        run: python -m cibuildwheel --output-dir wheelhouse
        # Options (https://cibuildwheel.readthedocs.io/en/stable/options/)
        env:
          # Build abi3 wheel for CPython 3.9+ (one wheel for all versions)
          # Build version-specific wheels for PyPy (which doesn't support abi3)
          # Using PyPy 3.11 (current maintained version)
          CIBW_BUILD: cp39-* pp311-*
          CIBW_SKIP: "*musllinux*"
          CIBW_ENABLE: pypy
          CIBW_PROJECT_REQUIRES_PYTHON: ">=3.9"
          CIBW_BEFORE_BUILD_MACOS: python3 -m pip install --upgrade setuptools wheel cffi
          CIBW_ARCHS_MACOS: "x86_64 arm64"
          CIBW_ARCHS_WINDOWS: "AMD64"
          CIBW_BEFORE_BUILD_WINDOWS: python -m pip install "setuptools<72"
          CIBW_ARCHS_LINUX: "x86_64"
          CIBW_BUILD_FRONTEND: "build"

      - uses: actions/upload-artifact@v4
        with:
          name: dist-${{ matrix.os }}
          path: ./wheelhouse/*.whl

  # Third job: Build source distribution
  build_sdist:
    name: Build source distribution
    needs: prepare_data
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4
        with:
          lfs: true

      - uses: actions/setup-python@v5
        with:
          python-version: '3.11'

      - name: Download compressed data artifacts
        uses: actions/download-artifact@v4
        with:
          name: compressed-bin-data
          path: src/islenska/resources/

      - name: Build sdist
        run: |
          python -m pip install build
          python -m build --sdist

      - uses: actions/upload-artifact@v4
        with:
          name: dist-sdist
          path: dist/*.tar.gz

  # Fourth job: Publish to PyPI (only for version tags)
  publish:
    name: Publish to PyPI
    needs: [build_wheels, build_sdist]
    runs-on: ubuntu-latest
    # Only publish on version tags (e.g., 1.2.3)
    if: startsWith(github.ref, 'refs/tags/') && !contains(github.ref, 'test')
    environment:
      name: pypi
      url: https://pypi.org/project/islenska/
    permissions:
      id-token: write

    steps:
      - name: Download all artifacts
        uses: actions/download-artifact@v4
        with:
          path: dist/
          pattern: dist-*
          merge-multiple: true

      - name: List distributions
        run: ls -lh dist/

      - name: Publish to PyPI
        uses: pypa/gh-action-pypi-publish@release/v1
