#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#

name: "Python Build Release Candidate"

on:
  push:
    tags:
      # Trigger this workflow when tag follows the versioning format: pyiceberg-<major>.<minor>.<patch>rc<release_candidate>
      # Example valid tags: pyiceberg-0.8.0rc2, pyiceberg-1.0.0rc1
      - 'pyiceberg-[0-9]+.[0-9]+.[0-9]+rc[0-9]+'
  workflow_dispatch:
    inputs:
      version:
        description: 'Version (e.g., 0.8.0)'
        type: string
        required: true
      rc:
        description: 'Release Candidate (RC) (e.g., 1)'
        type: number
        required: true

jobs:
  validate-inputs:
    runs-on: ubuntu-latest
    outputs:
      VERSION: ${{ steps.validate-inputs.outputs.VERSION }} # e.g. 0.8.0
      RC: ${{ steps.validate-inputs.outputs.RC }} # e.g. 1
    steps:
      - name: Validate and Extract Version and RC
        id: validate-inputs
        run: |
          if [ "$GITHUB_EVENT_NAME" = "push" ]; then
            echo "Workflow triggered by tag push."
            TAG=${GITHUB_REF#refs/tags/} # Extract the tag name
            VERSION_AND_RC=${TAG#pyiceberg-} # Remove the 'pyiceberg-' prefix
            VERSION=${VERSION_AND_RC%rc*} # Extract VERSION by removing everything after 'rc'
            RC=${VERSION_AND_RC#*rc} # Extract RC by keeping everything after 'rc'

            if [[ -z "$VERSION" || -z "$RC" ]]; then
              echo "Error: Unable to parse VERSION or RC from tag ($TAG). Ensure the tag format is correct."
              exit 1
            fi
          else
            echo "Workflow triggered manually via workflow_dispatch."
            VERSION="${{ github.event.inputs.version }}"
            RC="${{ github.event.inputs.rc }}"

            # Validate version (e.g., 1.0.0)
            if [[ ! "$VERSION" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
              echo "Error: version ($VERSION) must be in the format: <number>.<number>.<number>"
              exit 1
            fi

            # Validate rc (e.g., 1)
            if [[ ! "$RC" =~ ^[0-9]+$ ]]; then
              echo "Error: rc ($RC) must be in the format: <number>"
              exit 1
            fi
          fi

          # Export variables for future steps
          echo "VERSION=$VERSION" >> $GITHUB_OUTPUT
          echo "RC=$RC" >> $GITHUB_OUTPUT

      - name: Display Extracted Version and RC
        run: |
          echo "Using Version: ${{ steps.validate-inputs.outputs.VERSION }}"
          echo "Using RC: ${{ steps.validate-inputs.outputs.RC }}"

  validate-library-version:
    runs-on: ubuntu-latest
    needs:
      - validate-inputs
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 1

      - uses: actions/setup-python@v5
        with:
          python-version: 3.12

      - name: Install Poetry
        run: make install-poetry

      - name: Validate current pyiceberg version
        env:
          VERSION: ${{ needs.validate-inputs.outputs.VERSION }}
        run: |
          # Extract the current version from Poetry
          current_pyiceberg_version=$(poetry version --short)
          echo "Detected Poetry version: $current_pyiceberg_version"

          # Compare the input version with the Poetry version
          if [[ "$VERSION" != "$current_pyiceberg_version" ]]; then
            echo "Error: Input version ($VERSION) does not match the Poetry version ($current_pyiceberg_version)"
            exit 1
          fi

  # SVN
  svn-build-artifacts:
    needs:
      - validate-inputs
      - validate-library-version
    uses: ./.github/workflows/svn-build-artifacts.yml
    with:
      version: ${{ needs.validate-inputs.outputs.VERSION }}rc${{ needs.validate-inputs.outputs.RC }}

  # PyPi
  pypi-build-artifacts:
    needs:
      - validate-inputs
      - validate-library-version
    uses: ./.github/workflows/pypi-build-artifacts.yml
    with:
      version: ${{ needs.validate-inputs.outputs.VERSION }}rc${{ needs.validate-inputs.outputs.RC }}
