include ../../../Makefile.common

NPM := npm
PNPM := npx pnpm
CURRENT_VERSION := $(shell node -p "require('./package.json').version" 2>/dev/null || echo "0.0.0")
VERSION ?= $(CURRENT_VERSION)

.PHONY: info version bump-patch bump-minor bump-major bump-beta tag push-tag build test install clean lint format release release-and-push

info: ## Display current library version information
	@echo "Current semconv version: $(CURRENT_VERSION)"
	@echo "To set a specific version: make version VERSION=x.y.z"

version: ## Update version in package.json
	@echo "Updating semconv to version $(VERSION)"
	@$(PNPM) version $(VERSION) --no-git-tag-version
	@echo "✅ Version updated to $(VERSION)"
	@echo "Committing the changes"
	$(MAKE) commit

# Versioning utilities - shell commands instead of awk
bump-patch: ## Bump patch version (x.y.z -> x.y.(z+1))
	@VERSION_BASE=$$(echo "$(CURRENT_VERSION)" | cut -d'-' -f1); \
	MAJOR=$$(echo "$$VERSION_BASE" | cut -d. -f1); \
	MINOR=$$(echo "$$VERSION_BASE" | cut -d. -f2); \
	PATCH=$$(echo "$$VERSION_BASE" | cut -d. -f3); \
	NEW_PATCH=$$((PATCH + 1)); \
	NEW_VERSION="$$MAJOR.$$MINOR.$$NEW_PATCH"; \
	echo "Bumping patch version: $(CURRENT_VERSION) -> $$NEW_VERSION"; \
	$(MAKE) version VERSION=$$NEW_VERSION

bump-minor: ## Bump minor version (x.y.z -> x.(y+1).0)
	@VERSION_BASE=$$(echo "$(CURRENT_VERSION)" | cut -d'-' -f1); \
	MAJOR=$$(echo "$$VERSION_BASE" | cut -d. -f1); \
	MINOR=$$(echo "$$VERSION_BASE" | cut -d. -f2); \
	NEW_MINOR=$$((MINOR + 1)); \
	NEW_VERSION="$$MAJOR.$$NEW_MINOR.0"; \
	echo "Bumping minor version: $(CURRENT_VERSION) -> $$NEW_VERSION"; \
	$(MAKE) version VERSION=$$NEW_VERSION

bump-major: ## Bump major version (x.y.z -> (x+1).0.0)
	@VERSION_BASE=$$(echo "$(CURRENT_VERSION)" | cut -d'-' -f1); \
	MAJOR=$$(echo "$$VERSION_BASE" | cut -d. -f1); \
	NEW_MAJOR=$$((MAJOR + 1)); \
	NEW_VERSION="$$NEW_MAJOR.0.0"; \
	echo "Bumping major version: $(CURRENT_VERSION) -> $$NEW_VERSION"; \
	$(MAKE) version VERSION=$$NEW_VERSION

bump-beta: ## Create or increment beta version
	@VERSION_BASE=$$(echo "$(CURRENT_VERSION)" | cut -d'-' -f1); \
	if echo "$(CURRENT_VERSION)" | grep -q "beta"; then \
		BETA_NUM=$$(echo "$(CURRENT_VERSION)" | sed 's/.*-beta\.\([0-9]*\)/\1/'); \
		NEW_BETA_NUM=$$((BETA_NUM + 1)); \
	else \
		NEW_BETA_NUM=1; \
	fi; \
	NEW_VERSION="$$VERSION_BASE-beta.$$NEW_BETA_NUM"; \
	echo "Creating beta version: $(CURRENT_VERSION) -> $$NEW_VERSION"; \
	$(MAKE) version VERSION=$$NEW_VERSION

tag: ## Create a git tag for the current version
	@if git rev-parse "js-semconv-v$(CURRENT_VERSION)" >/dev/null 2>&1; then \
		echo "⚠️ Tag 'js-semconv-v$(CURRENT_VERSION)' already exists"; \
		exit 1; \
	fi
	@echo "Creating tag for semconv version $(CURRENT_VERSION)"
	@cd ../../../ && git tag -a "js-semconv-v$(CURRENT_VERSION)" -m "Release JavaScript semconv $(CURRENT_VERSION)"
	@echo "✅ Tag created successfully: js-semconv-v$(CURRENT_VERSION)"
	@echo "To push the tag, run: git push origin js-semconv-v$(CURRENT_VERSION) or make push-tag"

push-tag: ## Push the tag to remote repository
	@if ! git rev-parse "js-semconv-v$(CURRENT_VERSION)" >/dev/null 2>&1; then \
		echo "⚠️ Tag 'js-semconv-v$(CURRENT_VERSION)' doesn't exist. Create it first with 'make tag'"; \
		exit 1; \
	fi
	@echo "Pushing tag js-semconv-v$(CURRENT_VERSION) to remote..."
	@cd ../../../ && git push origin js-semconv-v$(CURRENT_VERSION)
	@echo "✅ Tag pushed successfully. The publish workflow will start automatically."

build: ## Build the library
	@echo "Building semconv..."
	@if grep -q "\"build\"" "package.json"; then $(PNPM) run build; else echo "No build script found"; fi

test: ## Run tests for the library
	@echo "Testing semconv..."
	@if grep -q "\"test\"" "package.json"; then $(PNPM) run test; else echo "No test script found"; fi

install: ## Install dependencies for the library
	@echo "Installing dependencies for semconv..."
	@$(PNPM) install

clean: ## Clean build artifacts and node_modules
	@echo "Cleaning semconv..."
	@rm -rf node_modules dist .parcel-cache .cache coverage

lint: ## Run linting
	@echo "Linting semconv..."
	@if grep -q "\"lint\"" "package.json"; then $(PNPM) run lint; else echo "No lint script found"; fi

format: ## Format code
	@echo "Formatting semconv code..."
	@if grep -q "\"format\"" "package.json"; then $(PNPM) run format; else echo "No format script found"; fi

publish: build test ## Build, test and publish to npm
	@echo "Publishing semconv $(CURRENT_VERSION)..."
	@$(PNPM) publish --access public --no-git-checks
	@echo "✅ Published semconv $(CURRENT_VERSION) to npm"

release: build test tag ## Build, test and create release tag
	@echo "✅ Release semconv $(CURRENT_VERSION) prepared!"
	@echo "To complete the release, run: git push origin js-semconv-v$(CURRENT_VERSION) or make push-tag"
	@echo "The publish workflow will automatically start when the tag is pushed."

commit: ## Commit the changes on the lib bump
	git add package.json
	git commit -m "Bump version to $(VERSION)"

release-and-push: release push-tag ## Build, test, create and push release tag
	@echo "✅ Release semconv $(CURRENT_VERSION) completed! The publish workflow should be running now."
