#
# 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@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
        with:
          fetch-depth: 1
          persist-credentials: false

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

      - name: Install UV
        uses: astral-sh/setup-uv@fac544c07dec837d0ccb6301d7b5580bf5edae39 # v8.2.0
        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 }}
