#!/usr/bin/env bash
# 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.

set -euo pipefail

# shellcheck source-path=SCRIPTDIR
source "$(dirname "${BASH_SOURCE[0]}")/lib/init.sh"

# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# Default mode
MODE=""

# Parse arguments
while [[ $# -gt 0 ]]; do
    case $1 in
        --check)
            MODE="check"
            shift
            ;;
        --fix)
            MODE="fix"
            shift
            ;;
        --help|-h)
            echo "Usage: $0 [--check|--fix]"
            echo ""
            echo "Sync Python SDK version between Cargo.toml and pyproject.toml"
            echo ""
            echo "Options:"
            echo "  --check    Check if versions are synchronized"
            echo "  --fix      Update the older version to match the newer one"
            echo "  --help     Show this help message"
            exit 0
            ;;
        *)
            echo -e "${RED}Error: Unknown option $1${NC}"
            echo "Use --help for usage information"
            exit 1
            ;;
    esac
done

# Require mode to be specified
if [ -z "$MODE" ]; then
    echo -e "${RED}Error: Please specify either --check or --fix${NC}"
    echo "Use --help for usage information"
    exit 1
fi

# Get the repository root (two levels up from scripts/ci/)
REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)"
cd "$REPO_ROOT"

CARGO_TOML="foreign/python/Cargo.toml"
PYPROJECT_TOML="foreign/python/pyproject.toml"

# Extract version from Cargo.toml
CARGO_VERSION=$(grep '^version = ' "$CARGO_TOML" | head -1 | sed 's/version = "\(.*\)"/\1/')

# Extract version from pyproject.toml
PYPROJECT_VERSION=$(grep '^version = ' "$PYPROJECT_TOML" | head -1 | sed 's/version = "\(.*\)"/\1/')

if [ -z "$CARGO_VERSION" ]; then
    echo -e "${RED}Error: Could not extract version from $CARGO_TOML${NC}"
    exit 1
fi

if [ -z "$PYPROJECT_VERSION" ]; then
    echo -e "${RED}Error: Could not extract version from $PYPROJECT_TOML${NC}"
    exit 1
fi

# Normalize versions for comparison (both to strict PEP 440 format: X.Y.Z.devN)
# Handles both old format (0.7.2-dev.1 / 0.7.2.dev.1) and new (0.7.2-dev1 / 0.7.2.dev1)
normalize_version() {
    local v="$1"
    # -dev -> .dev (Cargo to PEP 440 separator)
    v="${v//-dev/.dev}"
    # .dev.N -> .devN (strip dot before counter if present)
    v=$(echo "$v" | sed -E 's/\.dev\.([0-9])/\.dev\1/')
    echo "$v"
}

# Convert PEP 440 format to Cargo format: .devN -> -devN
to_cargo_format() {
    local v="$1"
    echo "$v" | sed -E 's/\.dev([0-9])/-dev\1/'
}

# Compare two versions, returns:
#   0 if equal
#   1 if first is greater
#   2 if second is greater
compare_versions() {
    local v1="$1"
    local v2="$2"

    # Normalize both versions
    v1=$(normalize_version "$v1")
    v2=$(normalize_version "$v2")

    if [ "$v1" = "$v2" ]; then
        echo 0
        return
    fi

    # Extract base version and dev number
    local base1 dev1 base2 dev2
    if [[ "$v1" =~ ^([0-9]+\.[0-9]+\.[0-9]+)(\.dev([0-9]+))?$ ]]; then
        base1="${BASH_REMATCH[1]}"
        dev1="${BASH_REMATCH[3]:-0}"
    else
        base1="$v1"
        dev1="0"
    fi

    if [[ "$v2" =~ ^([0-9]+\.[0-9]+\.[0-9]+)(\.dev([0-9]+))?$ ]]; then
        base2="${BASH_REMATCH[1]}"
        dev2="${BASH_REMATCH[3]:-0}"
    else
        base2="$v2"
        dev2="0"
    fi

    # Compare base versions using POSIX sort (X.Y.Z numeric per component).
    local sorted
    sorted=$(printf '%s\n%s' "$base1" "$base2" | sort -t. -k1,1n -k2,2n -k3,3n | head -1)

    if [ "$base1" != "$base2" ]; then
        if [ "$sorted" = "$base1" ]; then
            echo 2  # v2 is greater
        else
            echo 1  # v1 is greater
        fi
        return
    fi

    # Base versions are equal, compare dev numbers
    if [ "$dev1" -gt "$dev2" ]; then
        echo 1
    elif [ "$dev1" -lt "$dev2" ]; then
        echo 2
    else
        echo 0
    fi
}

CARGO_NORMALIZED=$(normalize_version "$CARGO_VERSION")
PYPROJECT_NORMALIZED=$(normalize_version "$PYPROJECT_VERSION")

echo "Python SDK version check:"
echo "  Cargo.toml:     $CARGO_VERSION (normalized: $CARGO_NORMALIZED)"
echo "  pyproject.toml: $PYPROJECT_VERSION"
echo ""

if [ "$MODE" = "check" ]; then
    if [ "$CARGO_NORMALIZED" = "$PYPROJECT_NORMALIZED" ]; then
        echo -e "${GREEN}✓ Python SDK versions are synchronized${NC}"
        exit 0
    else
        echo -e "${RED}✗ Python SDK versions are NOT synchronized${NC}"
        echo ""
        echo "Please ensure both files have the same version:"
        echo "  - $CARGO_TOML: use format like '0.6.4-dev1'"
        echo "  - $PYPROJECT_TOML: use format like '0.6.4.dev1'"
        echo ""
        echo -e "${YELLOW}Run '$0 --fix' to fix this automatically${NC}"
        exit 1
    fi
elif [ "$MODE" = "fix" ]; then
    if [ "$CARGO_NORMALIZED" = "$PYPROJECT_NORMALIZED" ]; then
        echo -e "${GREEN}✓ Python SDK versions are already synchronized${NC}"
        exit 0
    fi

    COMPARISON=$(compare_versions "$CARGO_VERSION" "$PYPROJECT_VERSION")

    if [ "$COMPARISON" = "1" ]; then
        # Cargo version is newer, update pyproject.toml
        NEW_PYPROJECT_VERSION="$CARGO_NORMALIZED"
        echo -e "${YELLOW}Cargo.toml has newer version, updating pyproject.toml...${NC}"
        sed -i.bak "s/^version = \"$PYPROJECT_VERSION\"/version = \"$NEW_PYPROJECT_VERSION\"/" "$PYPROJECT_TOML"
        rm -f "$PYPROJECT_TOML.bak"
        echo -e "${GREEN}✓ Updated $PYPROJECT_TOML: $PYPROJECT_VERSION -> $NEW_PYPROJECT_VERSION${NC}"
    elif [ "$COMPARISON" = "2" ]; then
        # pyproject version is newer, update Cargo.toml
        NEW_CARGO_VERSION=$(to_cargo_format "$PYPROJECT_NORMALIZED")
        echo -e "${YELLOW}pyproject.toml has newer version, updating Cargo.toml...${NC}"
        sed -i.bak "s/^version = \"$CARGO_VERSION\"/version = \"$NEW_CARGO_VERSION\"/" "$CARGO_TOML"
        rm -f "$CARGO_TOML.bak"
        echo -e "${GREEN}✓ Updated $CARGO_TOML: $CARGO_VERSION -> $NEW_CARGO_VERSION${NC}"
    fi

    exit 0
fi
