#!/usr/bin/env bash

set -euo pipefail

echo "🔄 Bi-directional sync between mise.toml and version files"
echo ""

MISE_TOML="mise.toml"

if [ ! -f "$MISE_TOML" ]; then
    echo "❌ Error: mise.toml not found"
    exit 1
fi

read_from_mise() {
    MISE_NODE=$(grep '^node = ' "$MISE_TOML" | sed 's/^node = "\(.*\)"/\1/' | tr -d '[:space:]')
    MISE_RUBY=$(grep '^ruby = ' "$MISE_TOML" | sed 's/^ruby = "\(.*\)"/\1/' | tr -d '[:space:]')
    MISE_JAVA_RAW=$(grep '^java = ' "$MISE_TOML" | sed 's/^java = "\(.*\)"/\1/' | tr -d '[:space:]')
    MISE_YARN=$(grep '^yarn = ' "$MISE_TOML" | sed 's/^yarn = "\(.*\)"/\1/' | tr -d '[:space:]')

    # Transform Java: corretto-17.0.17.10.1 → 17.0.17-amzn
    if [[ "$MISE_JAVA_RAW" =~ ^corretto-([0-9]+\.[0-9]+\.[0-9]+)\. ]]; then
        MISE_JAVA="${BASH_REMATCH[1]}-amzn"
    else
        MISE_JAVA="$MISE_JAVA_RAW"
    fi
}

read_from_files() {
    FILE_NODE=$(cat .node-version 2>/dev/null | tr -d '[:space:]' || echo "")
    FILE_RUBY=$(cat .ruby-version 2>/dev/null | tr -d '[:space:]' || echo "")
    FILE_JAVA=$(cat .java-version 2>/dev/null | tr -d '[:space:]' || echo "")
    FILE_YARN=$(cat .yarn-version 2>/dev/null | tr -d '[:space:]' || echo "")
}

check_differences() {
    DIFFERENCES=0

    if [ "$MISE_NODE" != "$FILE_NODE" ]; then
        echo "📦 Node.js:"
        echo "   mise.toml:     $MISE_NODE"
        echo "   .node-version: $FILE_NODE"
        echo ""
        DIFFERENCES=1
    fi

    if [ "$MISE_RUBY" != "$FILE_RUBY" ]; then
        echo "💎 Ruby:"
        echo "   mise.toml:     $MISE_RUBY"
        echo "   .ruby-version: $FILE_RUBY"
        echo ""
        DIFFERENCES=1
    fi

    if [ "$MISE_JAVA" != "$FILE_JAVA" ]; then
        echo "☕ Java:"
        echo "   mise.toml:     $MISE_JAVA (from $MISE_JAVA_RAW)"
        echo "   .java-version: $FILE_JAVA"
        echo ""
        DIFFERENCES=1
    fi

    if [ "$MISE_YARN" != "$FILE_YARN" ]; then
        echo "📦 Yarn:"
        echo "   mise.toml:     $MISE_YARN"
        echo "   .yarn-version: $FILE_YARN"
        echo ""
        DIFFERENCES=1
    fi

    return $DIFFERENCES
}

sync_to_files() {
    echo "📝 Syncing FROM mise.toml TO version files..."
    echo ""

    echo "$MISE_NODE" > .node-version
    echo "✅ Updated .node-version → $MISE_NODE"

    echo "$MISE_RUBY" > .ruby-version
    echo "✅ Updated .ruby-version → $MISE_RUBY"

    echo "$MISE_JAVA" > .java-version
    echo "✅ Updated .java-version → $MISE_JAVA"

    echo "$MISE_YARN" > .yarn-version
    echo "✅ Updated .yarn-version → $MISE_YARN"

    echo ""
    echo "✅ Version files synced from mise.toml"
    echo ""
    echo "💡 To install the new versions, run: mise install"
}

sync_to_mise() {
    echo "📝 Syncing FROM version files TO mise.toml..."
    echo ""

    # Transform Java: 17.0.17-amzn → corretto-17.0.17.10.1
    MISE_JAVA_NEW="$FILE_JAVA"
    if [[ "$FILE_JAVA" =~ ^([0-9]+\.[0-9]+\.[0-9]+)-amzn$ ]]; then
        BASE_VERSION="${BASH_REMATCH[1]}"
        case "$BASE_VERSION" in
            "17.0.14")
                MISE_JAVA_NEW="corretto-17.0.14.7.1"
                ;;
            "17.0.17")
                MISE_JAVA_NEW="corretto-17.0.17.10.1"
                ;;
            *)
                echo "⚠️  Warning: Unknown Corretto version $BASE_VERSION"
                echo "   Using format: corretto-$BASE_VERSION"
                MISE_JAVA_NEW="corretto-$BASE_VERSION"
                ;;
        esac
    fi

    cat > "$MISE_TOML" <<EOF
# Tool versions managed by mise (https://github.com/jdx/mise)
#
# SOURCE OF TRUTH for Node.js, Ruby, Java, and Yarn versions.
# After editing this file, run: yarn versions:sync
# This will update .node-version, .ruby-version, .java-version, .yarn-version
#
# Adjust here when upgrading core build/runtime dependencies.

[tools]
node = "$FILE_NODE"
ruby = "$FILE_RUBY"
java = "$MISE_JAVA_NEW"   # JDK vendor/version ($FILE_JAVA)
yarn = "$FILE_YARN"
EOF

    echo "✅ Updated mise.toml:"
    echo "   Node: $FILE_NODE"
    echo "   Ruby: $FILE_RUBY"
    echo "   Java: $MISE_JAVA_NEW (from $FILE_JAVA)"
    echo "   Yarn: $FILE_YARN"
    echo ""
    echo "✅ mise.toml synced from version files"
    echo ""
    echo "💡 To install the new versions, run: mise install"
}

read_from_mise
read_from_files

if check_differences; then
    echo "✅ All versions are in sync!"
    exit 0
fi

echo "⚠️  Versions are out of sync!"
echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo "Choose sync direction:"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
echo "  [1] Use mise.toml as source of truth (RECOMMENDED)"
echo "      └─> Updates: .node-version, .ruby-version, .java-version, .yarn-version"
echo ""
echo "  [2] Use .xxx-version files as source"
echo "      └─> Updates: mise.toml"
echo ""
echo "  [3] Cancel"
echo ""
read -p "Enter choice [1-3]: " -r CHOICE

case "$CHOICE" in
    1)
        sync_to_files
        ;;
    2)
        sync_to_mise
        ;;
    3)
        echo "❌ Cancelled - no changes made"
        exit 1
        ;;
    *)
        echo "❌ Invalid choice"
        exit 1
        ;;
esac
