GOPATH ?= $(shell go env GOPATH)
GOBIN ?= $(GOPATH)/bin
BINARY = muyue
BUILD_DIR = .
GO = go
NODE ?= node
NPM ?= npm
WEB_DIR = web

.PHONY: build install clean test test-short run scan fmt lint build-all deps vet frontend dev-desktop

frontend:
	cd $(WEB_DIR) && $(NPM) ci && $(NPM) run build

build: frontend
	$(GO) build -o $(BUILD_DIR)/$(BINARY) ./cmd/muyue/

install: build
	cp $(BUILD_DIR)/$(BINARY) /usr/local/bin/

install-local: build
	mkdir -p $(HOME)/.local/bin
	cp $(BUILD_DIR)/$(BINARY) $(HOME)/.local/bin/

clean:
	rm -f $(BUILD_DIR)/$(BINARY)
	rm -rf $(WEB_DIR)/dist
	rm -rf $(WEB_DIR)/node_modules

test:
	$(GO) test ./... -v -count=1

test-short:
	$(GO) test ./... -v -short -count=1 -timeout 60s

vet:
	$(GO) vet ./...

run: build
	./$(BINARY)

desktop: build
	./$(BINARY) desktop

dev-desktop:
	cd $(WEB_DIR) && $(NPM) run dev

scan: build
	./$(BINARY) scan

fmt:
	gofmt -w .
	which goimports > /dev/null 2>&1 && goimports -w . || true

lint:
	which golangci-lint > /dev/null 2>&1 && golangci-lint run || true

build-all: frontend
	GOOS=linux GOARCH=amd64 $(GO) build -o dist/$(BINARY)-linux-amd64 ./cmd/muyue/
	GOOS=linux GOARCH=arm64 $(GO) build -o dist/$(BINARY)-linux-arm64 ./cmd/muyue/
	GOOS=darwin GOARCH=amd64 $(GO) build -o dist/$(BINARY)-darwin-amd64 ./cmd/muyue/
	GOOS=darwin GOARCH=arm64 $(GO) build -o dist/$(BINARY)-darwin-arm64 ./cmd/muyue/
	GOOS=windows GOARCH=amd64 $(GO) build -o dist/$(BINARY)-windows-amd64.exe ./cmd/muyue/
	GOOS=windows GOARCH=arm64 $(GO) build -o dist/$(BINARY)-windows-arm64.exe ./cmd/muyue/

deps:
	$(GO) mod tidy
