#!/bin/bash

# Script to release a new version of the application
# Usage: ./release <new_version>

set -e  # Exit on any error

if [ $# -ne 1 ]; then
    echo "Usage: $0 <new_version>"
    echo "Example: $0 1.0.0"
    exit 1
fi

NEW_VERSION="$1"
WORKSPACE_CARGO="Cargo.toml"
CRATE_CARGO="desktop/Cargo.toml"

# Check if both Cargo.toml files exist
if [ ! -f "$WORKSPACE_CARGO" ]; then
    echo "Error: $WORKSPACE_CARGO not found in current directory"
    exit 1
fi

if [ ! -f "$CRATE_CARGO" ]; then
    echo "Error: $CRATE_CARGO not found"
    exit 1
fi

# Function to update version in a Cargo.toml file
update_version() {
    local file="$1"
    local tmp="${file}.tmp"

    # Portable in-place edit. `sed -i` behaves differently on GNU sed (Linux)
    # and BSD sed (macOS): on macOS `sed -i -E` treats `-E` as the backup
    # suffix instead of the extended-regex flag, leaving a stray
    # `Cargo.toml-E` behind and never updating the file.
    # Writing to a temp file and moving it over works on both implementations.
    if sed -E "s/^[[:space:]]*version[[:space:]]*=[[:space:]]*\"[^\"]+\"/version = \"$NEW_VERSION\"/" "$file" > "$tmp" \
        && mv "$tmp" "$file"; then
        echo "✓ Updated version to $NEW_VERSION in $file"
    else
        echo "Error: Failed to update version in $file"
        # Remove any partial temp file; the original file is untouched
        rm -f "$tmp"
        exit 1
    fi

    # The substitution can silently match nothing (e.g. a `version.workspace` key),
    # so verify the new version actually landed before moving on.
    if ! grep -q "^[[:space:]]*version[[:space:]]*=[[:space:]]*\"$NEW_VERSION\"" "$file"; then
        echo "Error: Version line not found/updated in $file"
        exit 1
    fi
}

# Update both Cargo.toml files
echo "Updating versions..."
update_version "$WORKSPACE_CARGO"
update_version "$CRATE_CARGO"

# Check git status before committing
echo "Checking git status..."
if git status --porcelain | grep -q .; then
    echo "Current uncommitted changes:"
    git status --short

    # Ask user if they want to commit all changes or just version files
    echo ""
    echo "Do you want to:"
    echo "1) Commit all current changes (including the version updates)"
    echo "2) Commit only the version file changes"
    echo "3) Abort the release"
    read -p "Enter choice (1/2/3): " choice

    case $choice in
        1)
            echo "Committing all changes..."
            git add .
            ;;
        2)
            echo "Committing only version file changes..."
            git add "$WORKSPACE_CARGO" "$CRATE_CARGO"
            ;;
        3)
            echo "Release aborted by user"
            exit 0
            ;;
        *)
            echo "Invalid choice. Release aborted."
            exit 1
            ;;
    esac
else
    # Only version files were modified, add them specifically
    echo "Only version files were modified, adding them for commit..."
    git add "$WORKSPACE_CARGO" "$CRATE_CARGO"
fi

# Commit the changes
COMMIT_MSG="chore: release version $NEW_VERSION"

if git commit -m "$COMMIT_MSG"; then
    echo "✓ Committed version changes"
else
    echo "Error: Failed to commit version changes"
    exit 1
fi

# Push version changes to origin
echo "Pushing version changes to origin..."
if git push origin master; then
    echo "✓ Successfully pushed version changes to origin"
else
    echo "Error: Failed to push version changes to origin"
    exit 1
fi

# Create git tag
TAG_NAME="v$NEW_VERSION"

if git tag -a "$TAG_NAME" -m "$COMMIT_MSG"; then
    echo "✓ Created git tag: $TAG_NAME"
else
    echo "Error: Failed to create git tag"
    exit 1
fi

# Push tag to origin
echo "Pushing tag to origin..."
if git push origin "$TAG_NAME"; then
    echo "✓ Successfully pushed tag to origin"
    echo "✓ Release $NEW_VERSION completed successfully!"
else
    echo "Error: Failed to push tag to origin"
    exit 1
fi
