#!/bin/bash
# Unified version management
# Usage: ./workflow/version [command]
#   (no args)  - Show current version
#   major      - Bump major version, reset counters
#   merge      - Increment merge counter (called by finish)
#   build      - Increment build counter (called by CI)
#   sync       - Sync version to all package.json files

set -e

VERSION_FILE="codebase/VERSION.json"

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

# Read current values
read_version() {
    MAJOR=$(jq -r '.major' "$VERSION_FILE")
    MERGES=$(jq -r '.merges' "$VERSION_FILE")
    BUILDS=$(jq -r '.builds' "$VERSION_FILE")
    VERSION="$MAJOR.$MERGES.$BUILDS"
}

# Write updated values
write_version() {
    local last_merge="$1"
    local last_build="$2"

    jq --arg v "$VERSION" \
       --argjson major "$MAJOR" \
       --argjson merges "$MERGES" \
       --argjson builds "$BUILDS" \
       --arg lastMerge "$last_merge" \
       --arg lastBuild "$last_build" \
       '.major = $major | .merges = $merges | .builds = $builds | .version = $v |
        if $lastMerge != "" then .lastMerge = $lastMerge else . end |
        if $lastBuild != "" then .lastBuild = $lastBuild else . end' \
       "$VERSION_FILE" > "$VERSION_FILE.tmp" && mv "$VERSION_FILE.tmp" "$VERSION_FILE"
}

# Sync to all package.json files
sync_packages() {
    echo "Syncing version $VERSION to all packages..."

    find . -name "package.json" -not -path "*/node_modules/*" | while read -r pkg; do
        # Update version field
        jq --arg v "$VERSION" '.version = $v' "$pkg" > "$pkg.tmp" && mv "$pkg.tmp" "$pkg"
        echo "  Updated: $pkg"
    done

    echo "Done. $VERSION synced to all packages."
}

read_version

case "${1:-}" in
    "")
        echo "$VERSION"
        ;;

    "show"|"status")
        echo "Version: $VERSION"
        echo ""
        echo "  Major:  $MAJOR"
        echo "  Merges: $MERGES"
        echo "  Builds: $BUILDS"
        echo ""
        jq -r 'if .lastMerge then "Last merge: \(.lastMerge)" else empty end' "$VERSION_FILE"
        jq -r 'if .lastBuild then "Last build: \(.lastBuild)" else empty end' "$VERSION_FILE"
        ;;

    "major")
        echo "Current: $VERSION"
        ((MAJOR++))
        MERGES=0
        BUILDS=0
        VERSION="$MAJOR.$MERGES.$BUILDS"
        write_version "" ""
        echo "New:     $VERSION"
        echo ""
        echo "Major version bumped. Counters reset."
        echo "Consider: git tag v$VERSION"
        ;;

    "merge")
        WORKTREE_NAME="${2:-unknown}"
        ((MERGES++))
        VERSION="$MAJOR.$MERGES.$BUILDS"
        write_version "$WORKTREE_NAME" ""
        echo "$VERSION"
        ;;

    "build")
        ((BUILDS++))
        VERSION="$MAJOR.$MERGES.$BUILDS"
        write_version "" "$(date -Iseconds)"
        echo "$VERSION"
        ;;

    "sync")
        sync_packages
        ;;

    *)
        echo "Usage: ./workflow/version [command]"
        echo ""
        echo "Commands:"
        echo "  (no args)  Show current version"
        echo "  show       Show version details"
        echo "  major      Bump major version, reset counters"
        echo "  merge      Increment merge counter"
        echo "  build      Increment build counter"
        echo "  sync       Sync to all package.json files"
        exit 1
        ;;
esac
