.PHONY: help install run run-server run-dashboard run-widget build build-all build-assets build-dashboard build-widget \
	package-current package-platform build-server-linux-amd64 clean-dist clean-temp generator enums migration testdata

DIST_DIR ?= dist
TMP_DIR := $(DIST_DIR)/.tmp
APP_NAME ?= cs-agent
ARCHIVE_NAME ?= cs-ai-agent
PACKAGE_ROOT_DIR ?= $(ARCHIVE_NAME)
APP_ENTRY ?= ./cmd/server
PLATFORMS := linux-amd64 linux-arm64 darwin-amd64 darwin-arm64 windows-amd64
CURRENT_GOOS := $(shell go env GOOS)
CURRENT_GOARCH := $(shell go env GOARCH)
CURRENT_PLATFORM := $(CURRENT_GOOS)-$(CURRENT_GOARCH)
PLATFORM ?= $(CURRENT_PLATFORM)

help:
	@echo "Available targets:"
	@echo "  make help                 Show this help message"
	@echo "  make install              Install Go, dashboard, and widget dependencies"
	@echo "  make run                  Run server, dashboard, and widget"
	@echo "  make run-server           Run Go server"
	@echo "  make run-dashboard        Run dashboard app"
	@echo "  make run-widget           Run widget app"
	@echo "  make build                Build assets and package current platform"
	@echo "  make build-all            Build and package all platforms"
	@echo "  make build-assets         Build dashboard and widget assets"
	@echo "  make build-dashboard      Build dashboard app"
	@echo "  make build-widget         Build widget sdk and app"
	@echo "  make package-current      Package current platform"
	@echo "  make package-platform     Package specified PLATFORM"
	@echo "  make build-server-linux-amd64 Build linux amd64 server binary"
	@echo "  make clean-dist           Remove dist directory"
	@echo "  make clean-temp           Remove temporary packaging files"
	@echo "  make generator            Run code generator"
	@echo "  make enums                Generate frontend enums"
	@echo "  make migration            Run migration command"
	@echo "  make testdata             Run testdata generator"

install:
	go mod download
	cd dashboard && pnpm install
	cd widget && pnpm install
	@echo "[install] done"

run:
	@server_pid=0; \
	dashboard_pid=0; \
	widget_pid=0; \
	trap 'kill $$server_pid $$dashboard_pid $$widget_pid 2>/dev/null || true' INT TERM EXIT; \
	$(MAKE) run-server & \
	server_pid=$$!; \
	$(MAKE) run-dashboard & \
	dashboard_pid=$$!; \
	$(MAKE) run-widget & \
	widget_pid=$$!; \
	while kill -0 $$server_pid 2>/dev/null && kill -0 $$dashboard_pid 2>/dev/null && kill -0 $$widget_pid 2>/dev/null; do \
		sleep 1; \
	done; \
	status=0; \
	wait $$server_pid || status=$$?; \
	wait $$dashboard_pid || status=$$?; \
	wait $$widget_pid || status=$$?; \
	kill $$server_pid $$dashboard_pid $$widget_pid 2>/dev/null || true; \
	exit $$status

run-server:
	go run ./cmd/server

run-dashboard:
	cd dashboard && pnpm dev

run-widget:
	cd widget && pnpm dev

build: clean-dist build-assets package-current clean-temp
	@echo "[build] done"

build-all: clean-dist build-assets
	@echo "[build-all] packaging platforms: $(PLATFORMS)"
	@for platform in $(PLATFORMS); do \
		echo "[build-all] packaging $$platform"; \
		$(MAKE) package-platform PLATFORM=$$platform; \
	done
	@$(MAKE) clean-temp
	@echo "[build-all] done"

build-assets: build-dashboard build-widget
	@echo "[build-assets] done"

build-dashboard:
	@echo "[build-dashboard] building dashboard app"
	cd dashboard && pnpm build
	@echo "[build-dashboard] done"

build-widget:
	@echo "[build-widget] building widget sdk"
	cd widget && pnpm build:sdk && pnpm build
	@echo "[build-widget] done"

package-current:
	@$(MAKE) package-platform PLATFORM=$(CURRENT_PLATFORM)

build-linux-amd64: clean-dist build-assets
	@$(MAKE) package-platform PLATFORM=linux-amd64
	@$(MAKE) clean-temp
	@echo "[build-server-linux-amd64] done"

package-platform:
	@platform="$(PLATFORM)"; \
	goos=$${platform%-*}; \
	goarch=$${platform#*-}; \
	stage_dir="$(TMP_DIR)/$$platform"; \
	package_dir="$$stage_dir/$(PACKAGE_ROOT_DIR)"; \
	dist_dir="$(CURDIR)/$(DIST_DIR)"; \
	archive_base="$$dist_dir/$(ARCHIVE_NAME)-$$platform"; \
	binary_name="$(APP_NAME)"; \
	if [ "$$goos" = "windows" ]; then binary_name="$(APP_NAME).exe"; fi; \
	echo "[package] start $$platform"; \
	rm -rf "$$stage_dir"; \
	mkdir -p "$$package_dir/dashboard" "$$package_dir/widget" "$$package_dir/config" "$$dist_dir"; \
	echo "[package] go build $$platform"; \
	GOOS=$$goos GOARCH=$$goarch go build -o "$$package_dir/$$binary_name" $(APP_ENTRY); \
	echo "[package] copy assets $$platform"; \
	cp -R dashboard/out "$$package_dir/dashboard/out"; \
	cp -R widget/out "$$package_dir/widget/out"; \
	echo "[package] include example config only"; \
	cp config/config.example.yaml "$$package_dir/config/config.example.yaml"; \
	rm -f "$$archive_base.zip"; \
	echo "[package] archive $$archive_base.zip"; \
	cd "$$stage_dir" && zip -rXq "$$archive_base.zip" "$(PACKAGE_ROOT_DIR)" -x "*.DS_Store" "__MACOSX/*"; \
	rm -rf "$$stage_dir"; \
	echo "[package] done $$platform -> $$archive_base.zip"

clean-dist:
	rm -rf $(DIST_DIR)

clean-temp:
	rm -rf $(TMP_DIR)

generator:
	go run ./cmd/generator/generator.go

enums:
	go run ./cmd/enums/generator.go

migration:
	go run ./cmd/migration

testdata:
	go run ./cmd/testdata
