#
# 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

permissions:
  contents: read

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
        shell: bash
        env:
          GITHUB_EVENT_INPUTS_VERSION: ${{ github.event.inputs.version }}
          GITHUB_EVENT_INPUTS_RC: ${{ github.event.inputs.rc }}

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

  validate-library-version:
    runs-on: ubuntu-latest
    needs:
      - validate-inputs
    steps:
      - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
        with:
          fetch-depth: 1
          persist-credentials: false

      - uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6
        with:
          python-version: 3.12

      - name: Install UV
        uses: astral-sh/setup-uv@5a095e7a2014a4212f075830d4f7277575a9d098 # v7.3.1
        with:
          enable-cache: false

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

          # Compare the input version with the UV version
          if [[ "$VERSION" != "$current_pyiceberg_version" ]]; then
            echo "Error: Input version ($VERSION) does not match the UV 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 }}
