.PHONY: all build install uninstall clean help test install-bootstrap-docs

# Build variables
BINARY_NAME=clawgo
BUILD_DIR=build
CMD_DIR=cmd/$(BINARY_NAME)
MAIN_GO=$(CMD_DIR)/main.go

# Version
VERSION?=$(shell git describe --tags --always --dirty 2>/dev/null || echo "dev")
BUILD_TIME=$(shell date +%FT%T%z)
STRIP_SYMBOLS?=1
BASE_LDFLAGS=-X main.version=$(VERSION) -X main.buildTime=$(BUILD_TIME)
EXTRA_LDFLAGS=
ifeq ($(STRIP_SYMBOLS),1)
	EXTRA_LDFLAGS+= -s -w
endif
LDFLAGS=-ldflags "$(BASE_LDFLAGS)$(EXTRA_LDFLAGS)"

# Go variables
GO?=go
GOFLAGS?=-v

# Installation
INSTALL_PREFIX?=/usr/local
INSTALL_BIN_DIR=$(INSTALL_PREFIX)/bin
INSTALL_MAN_DIR=$(INSTALL_PREFIX)/share/man/man1

# Workspace and Skills
USER_HOME:=$(if $(SUDO_USER),$(shell eval echo ~$(SUDO_USER)),$(HOME))
CLAWGO_HOME?=$(USER_HOME)/.clawgo
WORKSPACE_DIR?=$(CLAWGO_HOME)/workspace
WORKSPACE_SKILLS_DIR=$(WORKSPACE_DIR)/skills
BUILTIN_SKILLS_DIR=$(CURDIR)/skills

# OS detection
UNAME_S:=$(shell uname -s)
UNAME_M:=$(shell uname -m)

# Platform-specific settings
ifeq ($(UNAME_S),Linux)
	PLATFORM=linux
	ifeq ($(UNAME_M),x86_64)
		ARCH=amd64
	else ifeq ($(UNAME_M),aarch64)
		ARCH=arm64
	else ifeq ($(UNAME_M),riscv64)
		ARCH=riscv64
	else
		ARCH=$(UNAME_M)
	endif
else ifeq ($(UNAME_S),Darwin)
	PLATFORM=darwin
	ifeq ($(UNAME_M),x86_64)
		ARCH=amd64
	else ifeq ($(UNAME_M),arm64)
		ARCH=arm64
	else
		ARCH=$(UNAME_M)
	endif
else
	PLATFORM=$(UNAME_S)
	ARCH=$(UNAME_M)
endif

BINARY_PATH=$(BUILD_DIR)/$(BINARY_NAME)-$(PLATFORM)-$(ARCH)

# Default target
all: build

## build: Build the clawgo binary for current platform
build:
	@echo "Building $(BINARY_NAME) for $(PLATFORM)/$(ARCH)..."
	@mkdir -p $(BUILD_DIR)
	$(GO) build $(GOFLAGS) $(LDFLAGS) -o $(BINARY_PATH) ./$(CMD_DIR)
	@echo "Build complete: $(BINARY_PATH)"
	@ln -sf $(BINARY_NAME)-$(PLATFORM)-$(ARCH) $(BUILD_DIR)/$(BINARY_NAME)

## build-all: Build clawgo for all platforms
build-all:
	@echo "Building for multiple platforms..."
	@mkdir -p $(BUILD_DIR)
	GOOS=linux GOARCH=amd64 $(GO) build $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-linux-amd64 ./$(CMD_DIR)
	GOOS=linux GOARCH=arm64 $(GO) build $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-linux-arm64 ./$(CMD_DIR)
	GOOS=linux GOARCH=riscv64 $(GO) build $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-linux-riscv64 ./$(CMD_DIR)
# 	GOOS=darwin GOARCH=amd64 $(GO) build $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-darwin-amd64 ./$(CMD_DIR)
	GOOS=windows GOARCH=amd64 $(GO) build $(LDFLAGS) -o $(BUILD_DIR)/$(BINARY_NAME)-windows-amd64.exe ./$(CMD_DIR)
	@echo "All builds complete"

## install: Install clawgo to system and copy builtin skills
install: build
	@echo "Installing $(BINARY_NAME)..."
	@mkdir -p $(INSTALL_BIN_DIR)
	@rm -f $(INSTALL_BIN_DIR)/$(BINARY_NAME)
	@cp $(BUILD_DIR)/$(BINARY_NAME) $(INSTALL_BIN_DIR)/$(BINARY_NAME)
	@chmod +x $(INSTALL_BIN_DIR)/$(BINARY_NAME)
	@echo "Installed binary to $(INSTALL_BIN_DIR)/$(BINARY_NAME)"
	@echo "Installing builtin skills to $(WORKSPACE_SKILLS_DIR)..."
	@mkdir -p $(WORKSPACE_SKILLS_DIR)
	@for skill in $(BUILTIN_SKILLS_DIR)/*/; do \
		if [ -d "$$skill" ]; then \
			skill_name=$$(basename "$$skill"); \
			if [ -f "$$skill/SKILL.md" ]; then \
				cp -r "$$skill" $(WORKSPACE_SKILLS_DIR); \
				echo "  ✓ Installed skill: $$skill_name"; \
			fi; \
		fi; \
	done
	@$(MAKE) install-bootstrap-docs
	@echo "Installation complete!"

## install-bootstrap-docs: Incrementally sync AGENTS.md/SOUL.md/USER.md into workspace
install-bootstrap-docs:
	@echo "Incrementally syncing bootstrap docs to $(WORKSPACE_DIR)..."
	@mkdir -p $(WORKSPACE_DIR)
	@for f in AGENTS.md SOUL.md USER.md; do \
		src="$(CURDIR)/$$f"; \
		dst="$(WORKSPACE_DIR)/$$f"; \
		if [ ! -f "$$src" ]; then \
			continue; \
		fi; \
		if [ ! -f "$$dst" ]; then \
			cp "$$src" "$$dst"; \
			echo "  ✓ Added $$f"; \
			continue; \
		fi; \
		begin="# >>> CLAWGO MANAGED BLOCK: $$f >>>"; \
		end="# <<< CLAWGO MANAGED BLOCK: $$f <<<"; \
		tmp="$$(mktemp)"; \
		if grep -Fq "$$begin" "$$dst"; then \
			awk -v b="$$begin" -v e="$$end" -v src="$$src" '\
				BEGIN { in_block = 0 } \
				$$0 == b { \
					print; \
					while ((getline line < src) > 0) print line; \
					close(src); \
					in_block = 1; \
					next; \
				} \
				$$0 == e { in_block = 0; print; next } \
				!in_block { print } \
			' "$$dst" > "$$tmp"; \
		else \
			cat "$$dst" > "$$tmp"; \
			printf "\n%s\n" "$$begin" >> "$$tmp"; \
			cat "$$src" >> "$$tmp"; \
			printf "\n%s\n" "$$end" >> "$$tmp"; \
		fi; \
		mv "$$tmp" "$$dst"; \
		echo "  ✓ Updated $$f (incremental)"; \
	done

## install-user: Install clawgo to ~/.local and copy builtin skills
install-user:
	@$(MAKE) install INSTALL_PREFIX=$(USER_HOME)/.local

## install-skills: Install builtin skills to workspace
install-skills:
	@echo "Installing builtin skills to $(WORKSPACE_SKILLS_DIR)..."
	@mkdir -p $(WORKSPACE_SKILLS_DIR)
	@for skill in $(BUILTIN_SKILLS_DIR)/*/; do \
		if [ -d "$$skill" ]; then \
			skill_name=$$(basename "$$skill"); \
			if [ -f "$$skill/SKILL.md" ]; then \
				mkdir -p $(WORKSPACE_SKILLS_DIR)/$$skill_name; \
				cp -r "$$skill" $(WORKSPACE_SKILLS_DIR); \
				echo "  ✓ Installed skill: $$skill_name"; \
			fi; \
		fi; \
	done
	@echo "Skills installation complete!"

## uninstall: Remove clawgo from system
uninstall:
	@echo "Uninstalling $(BINARY_NAME)..."
	@rm -f $(INSTALL_BIN_DIR)/$(BINARY_NAME)
	@echo "Removed binary from $(INSTALL_BIN_DIR)/$(BINARY_NAME)"
	@echo "Note: Only the executable file has been deleted."
	@echo "If you need to delete all configurations (config.json, workspace, etc.), run 'make uninstall-all'"

## uninstall-all: Remove clawgo and all data
uninstall-all:
	@echo "Removing workspace and skills..."
	@rm -rf $(CLAWGO_HOME)
	@echo "Removed workspace: $(CLAWGO_HOME)"
	@echo "Complete uninstallation done!"

## clean: Remove build artifacts
clean:
	@echo "Cleaning build artifacts..."
	@rm -rf $(BUILD_DIR)
	@echo "Clean complete"

## fmt: Format Go code
fmt:
	@$(GO) fmt ./...

## deps: Update dependencies
deps:
	@$(GO) get -u ./...
	@$(GO) mod tidy

## run: Build and run clawgo
run: build
	@$(BUILD_DIR)/$(BINARY_NAME) $(ARGS)

## help: Show this help message
help:
	@echo "clawgo Makefile"
	@echo ""
	@echo "Usage:"
	@echo "  make [target]"
	@echo ""
	@echo "Targets:"
	@grep -E '^## ' $(MAKEFILE_LIST) | sed 's/## /  /'
	@echo ""
	@echo "Examples:"
	@echo "  make build              # Build for current platform"
	@echo "  make install            # Install to /usr/local/bin"
	@echo "  make install-user       # Install to ~/.local/bin"
	@echo "  make uninstall          # Remove from /usr/local/bin"
	@echo "  make install-skills     # Install skills to workspace"
	@echo ""
	@echo "Environment Variables:"
	@echo "  INSTALL_PREFIX          # Installation prefix (default: /usr/local)"
	@echo "  WORKSPACE_DIR           # Workspace directory (default: ~/.clawgo/workspace)"
	@echo "  VERSION                 # Version string (default: git describe)"
	@echo "  STRIP_SYMBOLS           # 1=strip debug/symbol info (default: 1)"
	@echo ""
	@echo "Current Configuration:"
	@echo "  Platform: $(PLATFORM)/$(ARCH)"
	@echo "  Binary: $(BINARY_PATH)"
	@echo "  Install Prefix: $(INSTALL_PREFIX)"
	@echo "  Workspace: $(WORKSPACE_DIR)"
