GO ?= go
AIR ?= air
SWAG ?= swag
GOOSE ?= goose
GOOSE_DIR ?= migrations/goose
MIGRATE_APPLY_FROM ?= 20260414

.PHONY: air swag test worker file-worker migrate-status migrate-up migrate-up-to migrate-apply migrate-reapply hospital-apply

air:
	@command -v $(AIR) >/dev/null 2>&1 || { \
		echo "air not found. Install with: go install github.com/air-verse/air@latest"; \
		exit 1; \
	}
	$(AIR) -c .air.toml

swag:
	@command -v $(SWAG) >/dev/null 2>&1 || { \
		echo "swag not found. Install with: go install github.com/swaggo/swag/cmd/swag@latest"; \
		exit 1; \
	}
	GOCACHE=$${GOCACHE:-/tmp/go-cache} $(SWAG) init -g cmd/api/main.go -o docs --parseDependency --parseInternal

test:
	$(GO) test ./... -coverprofile=coverage.out
	$(GO) tool cover -func=coverage.out

worker:
	WORKER_JOB=email $(GO) run ./cmd/worker

file-worker:
	WORKER_JOB=file_processing $(GO) run ./cmd/worker

migrate-status:
	@command -v $(GOOSE) >/dev/null 2>&1 || { \
		echo "goose not found. Install with: go install github.com/pressly/goose/v3/cmd/goose@latest"; \
		exit 1; \
	}
	@MYSQL_DSN_VAL="$${MYSQL_DSN:-$$(grep -hE '^MYSQL_DSN=' .env .env.local 2>/dev/null | tail -n1 | cut -d= -f2-)}"; \
	MYSQL_DSN_VAL="$${MYSQL_DSN_VAL#\"}"; MYSQL_DSN_VAL="$${MYSQL_DSN_VAL%\"}"; \
	test -n "$$MYSQL_DSN_VAL" || { echo "MYSQL_DSN is required (set env or define in .env/.env.local)"; exit 1; }; \
	$(GOOSE) -dir $(GOOSE_DIR) mysql "$$MYSQL_DSN_VAL" status

migrate-up:
	@command -v $(GOOSE) >/dev/null 2>&1 || { \
		echo "goose not found. Install with: go install github.com/pressly/goose/v3/cmd/goose@latest"; \
		exit 1; \
	}
	@MYSQL_DSN_VAL="$${MYSQL_DSN:-$$(grep -hE '^MYSQL_DSN=' .env .env.local 2>/dev/null | tail -n1 | cut -d= -f2-)}"; \
	MYSQL_DSN_VAL="$${MYSQL_DSN_VAL#\"}"; MYSQL_DSN_VAL="$${MYSQL_DSN_VAL%\"}"; \
	test -n "$$MYSQL_DSN_VAL" || { echo "MYSQL_DSN is required (set env or define in .env/.env.local)"; exit 1; }; \
	$(GOOSE) -dir $(GOOSE_DIR) mysql "$$MYSQL_DSN_VAL" up

migrate-up-to:
	@command -v $(GOOSE) >/dev/null 2>&1 || { \
		echo "goose not found. Install with: go install github.com/pressly/goose/v3/cmd/goose@latest"; \
		exit 1; \
	}
	@MYSQL_DSN_VAL="$${MYSQL_DSN:-$$(grep -hE '^MYSQL_DSN=' .env .env.local 2>/dev/null | tail -n1 | cut -d= -f2-)}"; \
	MYSQL_DSN_VAL="$${MYSQL_DSN_VAL#\"}"; MYSQL_DSN_VAL="$${MYSQL_DSN_VAL%\"}"; \
	test -n "$$MYSQL_DSN_VAL" || { echo "MYSQL_DSN is required (set env or define in .env/.env.local)"; exit 1; }; \
	test -n "$(v)" || { echo "usage: make migrate-up-to v=20260414"; exit 1; }; \
	$(GOOSE) -dir $(GOOSE_DIR) mysql "$$MYSQL_DSN_VAL" up-to $(v)

migrate-apply:
	@command -v $(GOOSE) >/dev/null 2>&1 || { \
		echo "goose not found. Install with: go install github.com/pressly/goose/v3/cmd/goose@latest"; \
		exit 1; \
	}
	@MYSQL_DSN_VAL="$${MYSQL_DSN:-$$(grep -hE '^MYSQL_DSN=' .env .env.local 2>/dev/null | tail -n1 | cut -d= -f2-)}"; \
	MYSQL_DSN_VAL="$${MYSQL_DSN_VAL#\"}"; MYSQL_DSN_VAL="$${MYSQL_DSN_VAL%\"}"; \
	test -n "$$MYSQL_DSN_VAL" || { echo "MYSQL_DSN is required (set env or define in .env/.env.local)"; exit 1; }; \
	MODULES="$(modules)"; \
	test -n "$$MODULES" || { \
		echo "usage: make migrate-apply modules=opc,kassa"; \
		echo "hint: use 'make migrate-reapply [from=YYYYMMDD]' for full down-to/up behavior"; \
		exit 1; \
	}; \
	TMP_DIR="$$(mktemp -d)"; \
	echo "Applying selected import apply migrations for modules: $$MODULES"; \
	for m in $$(echo "$$MODULES" | tr ',' ' '); do \
		FOUND="$$(ls -1 $(GOOSE_DIR)/*_$${m}_import_apply.sql 2>/dev/null || true)"; \
		if [ -z "$$FOUND" ]; then \
			echo "No apply migration found for module '$$m' in $(GOOSE_DIR)"; \
			rm -rf "$$TMP_DIR"; \
			exit 1; \
		fi; \
		for f in $$FOUND; do cp "$$f" "$$TMP_DIR"/; done; \
	done; \
	$(GOOSE) -dir "$$TMP_DIR" -no-versioning mysql "$$MYSQL_DSN_VAL" up; \
	rm -rf "$$TMP_DIR"

migrate-reapply:
	@command -v $(GOOSE) >/dev/null 2>&1 || { \
		echo "goose not found. Install with: go install github.com/pressly/goose/v3/cmd/goose@latest"; \
		exit 1; \
	}
	@MYSQL_DSN_VAL="$${MYSQL_DSN:-$$(grep -hE '^MYSQL_DSN=' .env .env.local 2>/dev/null | tail -n1 | cut -d= -f2-)}"; \
	MYSQL_DSN_VAL="$${MYSQL_DSN_VAL#\"}"; MYSQL_DSN_VAL="$${MYSQL_DSN_VAL%\"}"; \
	test -n "$$MYSQL_DSN_VAL" || { echo "MYSQL_DSN is required (set env or define in .env/.env.local)"; exit 1; }; \
	FROM_VER="$(from)"; \
	if [ -z "$$FROM_VER" ]; then FROM_VER="$(MIGRATE_APPLY_FROM)"; fi; \
	echo "Re-applying migrations from version $$FROM_VER to latest"; \
	$(GOOSE) -dir $(GOOSE_DIR) mysql "$$MYSQL_DSN_VAL" down-to "$$FROM_VER"; \
	$(GOOSE) -dir $(GOOSE_DIR) mysql "$$MYSQL_DSN_VAL" up

hospital-apply: migrate-apply
