OUT_DIR := out
MOCHA_OPTIONS ?= -R dot -r source-map-support/register

.PHONY: all
all: build dev

build = node_modules/.bin/tsc
before-build = $(OUT_DIR)/node_modules

.PHONY: deps
deps:
	@npm ci

.PHONY: build
build: $(before-build)
	$(build) -p tsconfig-base.json

.PHONY: build-static
build-static:
	@mkdir -p out
	@rm -rf out/static
	@cp -r src/static out/static
	@node ./tools/prepare-static.js

.PHONY: build-watch
build-watch: $(before-build)
	$(build) --watch

.PHONY: build-production
build-production: build-static $(before-build)
	$(build) -p tsconfig-production.json

$(OUT_DIR)/node_modules:
	mkdir -p $@
	ln -s ../app ../tests $@

.PHONY: clean
clean:
	rm -rf $(OUT_DIR)

.PHONY: patch minor major
patch minor major:
	@VERSION="yandexauto-v$$(node_modules/.bin/qtools tag $@)" && \
		arc add .qtools.json && \
		arc commit -m $$VERSION -n && \
		arc tag $$VERSION

.PHONY: publish-static
publish-static:
	node_modules/.bin/qtools upload-static

.PHONY: release-testing
release-testing:
	node_modules/.bin/qtools release testing -- --build-arg QTOOLS_TOKEN --build-arg STATIC_CLIENT_KEY

.PHONY: dev
dev:
	@node_modules/.bin/supervisor \
		--non-interactive \
		--quiet \
		--no-restart-on exit \
		--watch $(OUT_DIR)/app \
		-- -r source-map-support/register $(OUT_DIR)/app/app.js

.PHONY: validate
validate: test lint validate-api-doc

.PHONY: test
test: build run-test

.PHONY: run-test
run-test:
	DISABLE_LOGGING=1 node_modules/.bin/mocha $(MOCHA_OPTIONS) --recursive $(OUT_DIR)/tests

.PHONY: lint
lint:
	node_modules/.bin/tslint -p tsconfig.json -t codeFrame $(if $(FIX),--fix)

.PHONY: validate-api-doc
validate-api-doc:
	node_modules/.bin/swagger-cli validate docs/v1/spec.yaml > /dev/null
