.PHONY: build clean test lint lintfix run-server run-cli help build-ui migrate generate-models install-relspecgo seed

# Variables
FRONTEND_DIR=frontend
SQL_DIR=sql
MODELS_DIR=pkg/models

# Build both server and CLI
build: build-server build-cli build-ui

build-all: build ## Alias for build

# Build server and CLI
build-backend:
	@echo "Building WhatsHooked backend..."
	@mkdir -p bin
	@go build -o bin/whatshook-server ./cmd/server
	@go build -o bin/whatshook-cli ./cmd/cli
	@echo "Backend build complete! Binaries in bin/"

# Build server only
build-server:
	@echo "Building server..."
	@mkdir -p bin
	@go build -o bin/whatshook-server ./cmd/server
	@echo "Server built: bin/whatshook-server"

# Build CLI only
build-cli:
	@echo "Building CLI..."
	@mkdir -p bin
	@go build -o bin/whatshook-cli ./cmd/cli
	@echo "CLI built: bin/whatshook-cli"

# Clean build artifacts (preserves bin directory)
clean:
	@echo "Cleaning..."
	@mkdir -p bin
	@rm -f bin/whatshook*
	@echo "Clean complete!"

# Run tests with coverage
test:
	@echo "Running tests..."
	@go test -v -coverprofile=coverage.out -covermode=atomic ./...
	@echo "Coverage report saved to coverage.out"

# Run server (requires config.json)
run-server:
	@go run ./cmd/server -config config.json

# Run CLI
run-cli:
	@go run ./cmd/cli $(ARGS)

# Install dependencies
deps:
	@echo "Installing dependencies..."
	@go mod download
	@go mod tidy
	@if [ -d "$(FRONTEND_DIR)" ]; then \
		echo "Installing frontend dependencies..."; \
		cd $(FRONTEND_DIR) && npm install; \
	fi
	@echo "Dependencies installed!"

# Build frontend UI
build-ui:
	@echo "Building frontend..."
	@if [ -d "$(FRONTEND_DIR)" ]; then \
		cd $(FRONTEND_DIR) && npm run build; \
		echo "Frontend built successfully"; \
	else \
		echo "Frontend directory not found. Skipping..."; \
	fi

# Development mode for frontend
dev-ui:
	@echo "Starting frontend development server..."
	@if [ -d "$(FRONTEND_DIR)" ]; then \
		cd $(FRONTEND_DIR) && npm run dev; \
	else \
		echo "Frontend directory not found"; \
		exit 1; \
	fi

# Database commands
generate-models: ## Generate BUN models from DBML schema
	@echo "Generating models from DBML..."
	@if [ ! -f "$(SQL_DIR)/schema.dbml" ]; then \
		echo "Error: $(SQL_DIR)/schema.dbml not found"; \
		echo "Please create the DBML schema first"; \
		exit 1; \
	fi
	@mkdir -p $(MODELS_DIR)
	@$(HOME)/go/bin/relspec convert --from dbml --from-path=$(SQL_DIR)/schema.dbml --to bun --to-path=$(MODELS_DIR) --package models
	@echo "Models generated in $(MODELS_DIR)"

migrate: migrate-up ## Alias for migrate-up

migrate-up: ## Run database migrations (up)
	@echo "Running migrations..."
	@if [ -f "$(SQL_DIR)/migrate.sh" ]; then \
		bash $(SQL_DIR)/migrate.sh up; \
	else \
		echo "Migration script not found. Run 'make setup-migrations' first"; \
	fi

migrate-down: ## Rollback database migrations (down)
	@echo "Rolling back migrations..."
	@if [ -f "$(SQL_DIR)/migrate.sh" ]; then \
		bash $(SQL_DIR)/migrate.sh down; \
	else \
		echo "Migration script not found"; \
	fi

migrate-create: ## Create a new migration file (usage: make migrate-create NAME=migration_name)
	@if [ -z "$(NAME)" ]; then \
		echo "Error: NAME is required. Usage: make migrate-create NAME=migration_name"; \
		exit 1; \
	fi
	@mkdir -p $(SQL_DIR)/postgres $(SQL_DIR)/sqlite
	@timestamp=$$(date +%Y%m%d%H%M%S); \
	echo "-- Migration: $(NAME)" > $(SQL_DIR)/postgres/$${timestamp}_$(NAME).up.sql; \
	echo "-- Rollback: $(NAME)" > $(SQL_DIR)/postgres/$${timestamp}_$(NAME).down.sql; \
	echo "-- Migration: $(NAME)" > $(SQL_DIR)/sqlite/$${timestamp}_$(NAME).up.sql; \
	echo "-- Rollback: $(NAME)" > $(SQL_DIR)/sqlite/$${timestamp}_$(NAME).down.sql; \
	echo "Migration files created in $(SQL_DIR)/postgres and $(SQL_DIR)/sqlite"

setup-migrations: ## Setup migration scripts
	@echo "Setting up migration infrastructure..."
	@mkdir -p $(SQL_DIR)/postgres $(SQL_DIR)/sqlite
	@if [ ! -f "$(SQL_DIR)/migrate.sh" ]; then \
		echo "Creating migration script..."; \
		echo '#!/bin/bash' > $(SQL_DIR)/migrate.sh; \
		echo 'echo "Migration script placeholder. Implement your migration logic here."' >> $(SQL_DIR)/migrate.sh; \
		chmod +x $(SQL_DIR)/migrate.sh; \
	fi
	@echo "Migration infrastructure ready"

# Seed database
seed: ## Seed the database with initial data
	@echo "Seeding database..."
	@go run ./cmd/seed

# Install tools
install-relspecgo: ## Install relspecgo tool
	@echo "Installing relspec..."
	@go install git.warky.dev/wdevs/relspecgo/cmd/relspec@latest
	@echo "relspec installed successfully"

install-tools: install-relspecgo ## Install all required tools
	@echo "Installing development tools..."
	@go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest
	@echo "All tools installed"


release-version: ## Create and push a release with specific version (use: make release-version VERSION=v1.2.3)
	@if [ -z "$(VERSION)" ]; then \
		echo "Error: VERSION is required. Usage: make release-version VERSION=v1.2.3"; \
		exit 1; \
	fi
	@version="$(VERSION)"; \
	if ! echo "$$version" | grep -q "^v"; then \
		version="v$$version"; \
	fi; \
	echo "Creating release: $$version"; \
	latest_tag=$$(git describe --tags --abbrev=0 2>/dev/null || echo ""); \
	if [ -z "$$latest_tag" ]; then \
		commit_logs=$$(git log --pretty=format:"- %s" --no-merges); \
	else \
		commit_logs=$$(git log "$${latest_tag}..HEAD" --pretty=format:"- %s" --no-merges); \
	fi; \
	if [ -z "$$commit_logs" ]; then \
		tag_message="Release $$version"; \
	else \
		tag_message="Release $$version\n\n$$commit_logs"; \
	fi; \
	git tag -a "$$version" -m "$$tag_message"; \
	git push origin "$$version"; \
	echo "Tag $$version created and pushed to remote repository."


lint: ## Run linter
	@echo "Running linter..."
	@if command -v golangci-lint > /dev/null; then \
		golangci-lint run --config=.golangci.json; \
	else \
		echo "golangci-lint not installed. Install with: go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest"; \
		exit 1; \
	fi

lintfix: ## Run linter
	@echo "Running linter..."
	@if command -v golangci-lint > /dev/null; then \
		golangci-lint run --config=.golangci.json --fix; \
	else \
		echo "golangci-lint not installed. Install with: go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest"; \
		exit 1; \
	fi

# Help
help:
	@echo "WhatsHooked Makefile"
	@echo ""
	@echo "Build Commands:"
	@echo "  make build              - Build server, CLI, and UI"
	@echo "  make build-backend      - Build server and CLI only"
	@echo "  make build-server       - Build server only"
	@echo "  make build-cli          - Build CLI only"
	@echo "  make build-ui           - Build frontend UI"
	@echo ""
	@echo "Development Commands:"
	@echo "  make run-server         - Run server (requires config.json)"
	@echo "  make run-cli ARGS='...' - Run CLI with arguments"
	@echo "  make dev-ui             - Run frontend in development mode"
	@echo ""
	@echo "Database Commands:"
	@echo "  make generate-models    - Generate BUN models from DBML schema"
	@echo "  make migrate            - Run database migrations (up)"
	@echo "  make migrate-up         - Run database migrations (up)"
	@echo "  make migrate-down       - Rollback database migrations"
	@echo "  make migrate-create NAME=<name> - Create new migration"
	@echo "  make setup-migrations   - Setup migration infrastructure"
	@echo "  make seed               - Seed database with initial data"
	@echo ""
	@echo "Test & Quality:"
	@echo "  make test               - Run tests with coverage"
	@echo "  make lint               - Run linter"
	@echo "  make lintfix            - Run linter with auto-fix"
	@echo ""
	@echo "Dependencies:"
	@echo "  make deps               - Install all dependencies"
	@echo "  make install-relspecgo  - Install relspecgo tool"
	@echo "  make install-tools      - Install all development tools"
	@echo ""
	@echo "Other:"
	@echo "  make clean              - Remove build artifacts"
	@echo "  make release-version VERSION=v1.2.3 - Create release"
	@echo "  make help               - Show this help message"

