GO ?= go
TIMESCALE_VERSION := pg17
MOD_NAME := nats-app
DB_NAME := nats-db
NATS_NAME := nats-sv
NATS_VERSION := 2.12.0-alpine3.22

.PHONY: dockerize-db
# Remove and create a development database.
dockerize-db:
	docker rm -f $(DB_NAME)
	docker run --name $(DB_NAME) -e POSTGRES_PASSWORD=secret -e POSTGRES_USER=developer -e POSTGRES_DB=$(DB_NAME) -p 5432:5432 -d timescale/timescaledb-ha:$(TIMESCALE_VERSION)
	sleep 10
	make migrateup

.PHONY: dockerize-nats
# Remove and create a NATS server.
dockerize-nats:
	docker rm -f $(NATS_NAME)
	docker run --name $(NATS_NAME) -p 4222:4222 -d nats:$(NATS_VERSION)
	sleep 5

.PHONY: migrateup
# Migrate all schemas, triggers and data located in database/migrations.
migrateup:
	go run -tags 'postgres' github.com/golang-migrate/migrate/v4/cmd/migrate@latest -path app/database -database "postgresql://developer:secret@localhost:5432/$(DB_NAME)?sslmode=disable" -verbose up

.PHONY: mock
#Mock database
mock:
	go run go.uber.org/mock/mockgen@latest -package mock -destination internal/domains/sensors/mock/querier.go $(MOD_NAME)/internal/domains/sensors Repository 
	

.PHONY: run
# Start app in development environment
run:
	go run ./app/.

.PHONY: run-prod
run-prod:
# Start app in production environment
	go run ./app/. -env=prod

.PHONY: lazy-start
lazy-start:
# Install dependencies, tools, dockerize containers, run tests and run app.
	make dockerize-db
	make dockerize-nats
	make run-prod