MAKEFLAGS+=-j 15
NPM_BIN=$(CURDIR)/node_modules/.bin
PLIBS=$(CURDIR)/plibs
LANGS?=ru en tr uk

ENV?=production

# use NPMCACHE=y to skip loading cached packages from the registry
NPMCACHE?=n

# use MIN=n to skip minimizing files
MIN?=y

ifeq ($(MIN),y)
	MINIMIZE_JS=--minimize=true
	MINIMIZE_CSS=--minimize=true
else
    MINIMIZE_JS=--minimize=false
    MINIMIZE_CSS=--minimize=false
endif


# Page templates are the templates named <page_name>/<page_name>.yate
PAGE_TEMPLATES=$(shell find pages -type f | grep -P "\/(.*?)\/\1\.yate$$")
PAGEDIRS?=$(foreach template, $(PAGE_TEMPLATES), $(shell echo $(dir $(template)) | sed 's/pages\///' | sed 's/\/$$//'))
PAGENAMES=$(shell echo $(PAGEDIRS) | sed 's/\//./g')

# REACT
REACT_PAGE_TEMPLATES=$(shell find react-pages -type f | grep -P "\/(.*?)\/client.jsx$$")
REACT_PAGEDIRS?=$(foreach template, $(REACT_PAGE_TEMPLATES), $(shell echo $(dir $(template)) | sed 's/react-pages\///' | sed 's/\/$$//'))

JS_BLOCK=$(shell find blocks -type f | grep "\.js$$" | grep -v "\.field\.js$$" | fgrep -v "_externals/externals.js" | grep -P "\/(.*?)\/\1\.js$$")
JS_BUILT=$(foreach page, $(PAGENAMES), $(foreach lang, $(LANGS), public/js/$(page).$(lang).js))

CSS_BLOCK=$(shell find blocks -type f | grep "\.styl$$")
CSS_BUILT=$(foreach p,$(PAGENAMES),public/css/$(p).css)
CSS_IE_BUILT=$(foreach css, $(CSS_BUILT), $(basename $(css)).ie.css)

YATE_BLOCK=$(shell find blocks -type f | grep "\.yate$$")
YATE_BUILT=$(foreach p, $(PAGENAMES), templates/$(p).js)

JSX_BLOCK=$(shell find blocks -type f | grep "\.jsx$$")

JSX_SERVER_TEMPLATES=$(shell cd react-pages && find $(REACT_PAGEDIRS) -type f | grep "server.jsx$$")
JSX_SERVER_BUILT=$(foreach t, $(JSX_SERVER_TEMPLATES), react-pages/$(t).tmp)

JSX_CLIENT_TEMPLATES=$(shell cd react-pages && find $(REACT_PAGEDIRS) -type f | grep "client.jsx$$")
JSX_CLIENT_BUILT=$(foreach t, $(JSX_CLIENT_TEMPLATES), react-pages/$(t).tmp)

LOCALIZATIONS=$(foreach lang, $(LANGS), $(shell find loc -type f | grep "\.$(lang)\.loc$$"))

# Calculate the path to the project root from the given file
RELATIVEROOT=$(shell python -c "import os.path; print os.path.relpath('/', '/$(1)')" | sed 's/\//\\\//g')

# First letter to uppercase
UCFIRST=$(shell echo $(1) | grep -oP '^(.)' | tr a-z A-Z)$(shell echo $(1) | cut -c2-)

# Localize $(2) into $(3) with locale $(1)
LOCALIZE=@if [ `cat $(2) | wc -c` -ne "0" ]; then echo 'Localizing $(2) into $(3) with locale $(1)'; $(PLIBS)/d2-build-tools/bin/d2-localize --path loc --locale $(1) $(2) > $(3); else echo '$(2) is empty, touching $(3)'; touch $(3); fi

VERSION?=$(shell dpkg-parsechangelog | sed -n 's/^Version: //p')
#-------------------------------------------------------------


all: client server

client: $(JS_BUILT) $(CSS_BUILT) $(JSX_CLIENT_BUILT) node_modules
server: $(YATE_BUILT) $(JSX_SERVER_BUILT) node_modules


#-------------------------------------------------------------


loc: node_modules
	@if [ -f ./loc/locs.json ]; then rm ./loc/locs.json ; fi
	@sh ./tools/l11n.sh

	@touch ./loc/locs.json
	@python ./tools/flatlocs.py
	@rm ./loc/_locs.json

loc-unapproved:
	@sh ./tools/l11n.sh unapproved


#-------------------------------------------------------------


codestyle: node_modules testonly
	@sh ./tools/stylus/checkRem.sh ./blocks ./pages
	$(NPM_BIN)/jshint . && $(NPM_BIN)/jscs .

testonly:
	@sh ./tools/checkOnly.sh ./test

testfiles: $(JS_BLOCK) node_modules
	@mkdir -p test/client/_build

	echo "/* borschik:include:../loc/dynamic/tanker.dynamic.ru.js */" > blocks/blocks.tmp.js
	cat blocks/blocks.js >> blocks/blocks.tmp.js

	$(NPM_BIN)/borschik -t js --minimize=false -i blocks/blocks.tmp.js -o test/client/_build/blocks.tmp.js
	$(call LOCALIZE, ru, test/client/_build/blocks.tmp.js, test/client/_build/blocks.js)
	rm test/client/_build/blocks.tmp.js blocks/blocks.tmp.js

#-------------------------------------------------------------


clean:
	@rm -f $(YATE_BUILT) $(CSS_BUILT) $(JS_BUILT) $(CSS_IE_BUILT) pages/*/*.obj templates/*.react.* public/js/*.react.*

clean-all: clean
	@rm -rf node_modules


#-------------------------------------------------------------


node_modules: package.json
	/opt/nodejs/10/bin/npm i --registry http://npm.yandex-team.ru
	cd $(PLIBS) && /opt/nodejs/10/bin/npm i --registry http://npm.yandex-team.ru
#ifeq ($(NPMCACHE),y)
#	@echo "Installing npm modules from cache, if available"
#	npm install --registry http://npm.yandex-team.ru --cache-min 86400
#else
## TODO: npm install в этом месте не отрабатывает в тимсити
#	@echo "Loading npm modules"
#	npm install --registry http://npm.yandex-team.ru
#endif

# В случае, если package.json новее, чем node_modules make всегда будет выполять зависимость
	@touch node_modules


#-------------------------------------------------------------


# Create a new page from the template
pages/%: name=$(notdir $*)
pages/%: fullname=$(shell echo $* | sed 's/\//./g')
pages/%: ucname=$(call UCFIRST, "$(name)")
pages/%:
	mkdir -p pages/$*
	cat tools/template/template.js   | sed 's/{{PAGENAME}}/$(fullname)/g' > pages/$*/$(name).js
	cat tools/template/template.styl | sed 's/{{PAGENAME}}/$(fullname)/g' > pages/$*/$(name).styl
	cat tools/template/template.yate | sed 's/{{PAGENAME}}/$(fullname)/g' > pages/$*/$(name).yate

	cat tools/template/TemplateLayout.js | sed 's/{{RELATIVEROOT}}/..\/$(call RELATIVEROOT, "$*")/g' | sed 's/{{PAGENAME}}/$(fullname)/g' > pages/$*/$(ucname)Layout.js
	cat tools/template/TemplatePage.js   | sed 's/{{RELATIVEROOT}}/..\/$(call RELATIVEROOT, "$*")/g' | sed 's/{{PAGENAME}}/$(fullname)/g' | sed 's/{{UCNAME}}/$(ucname)/g' > pages/$*/$(ucname)Page.js


#-------------------------------------------------------------


pre-build: ENVIRONMENTS=$(shell ls config | fgrep -v 'current' | fgrep -v 'development' | fgrep -v '_common')
pre-build: public_symlinks
	for env in $(ENVIRONMENTS); do sed -i 's/{{VERSION}}/$(VERSION)/g' config/$$env/index.js; done

public_symlinks: node_modules
	find public -type l | while read SYMLINK; do RESOLVED=`readlink -f $$SYMLINK`; rm "$$SYMLINK"; cp -r "$$RESOLVED" "$$SYMLINK"; done


#-------------------------------------------------------------


.SECONDEXPANSION:

$(JS_BUILT): lang=$(subst .,,$(suffix $(basename $@)))
$(JS_BUILT): fullname=$(notdir $(basename $(basename $@)))
$(JS_BUILT): name=$(subst .,,$(suffix .$(fullname)))
$(JS_BUILT): dir=pages/$(shell echo $(fullname) | sed 's/\./\//g')
$(JS_BUILT): $$(dir)/$$(name).js $(JS_BLOCK) node_modules $(JS_CLIENT) .borschik blocks/blocks.js $(LOCALIZATIONS)
	cat $< | sed 's/{{LANG}}/$(lang)/g' | sed 's/{{RELATIVEROOT}}/$(call RELATIVEROOT, "$(dir)")/g' > $<.$(lang).tmp
	$(NPM_BIN)/borschik -t js --minimize=false -i $<.$(lang).tmp -o $<.$(lang).nonlocalized.js
	$(call LOCALIZE, $(lang), $<.$(lang).nonlocalized.js, $<.$(lang).unminified)
	$(NPM_BIN)/borschik -t js $(MINIMIZE_JS) -i $<.$(lang).unminified -o $@
	rm $<.$(lang).tmp $<.$(lang).nonlocalized.js $<.$(lang).unminified

$(CSS_BUILT): fullname=$(notdir $(basename $@))
$(CSS_BUILT): name=$(subst .,,$(suffix .$(fullname)))
$(CSS_BUILT): dir=pages/$(shell echo $(fullname) | sed 's/\./\//g')
$(CSS_BUILT): $$(dir)/$$(name).styl $(CSS_BLOCK) node_modules tools/build-css.js .borschik
	cat $< | sed 's/{{RELATIVEROOT}}/$(call RELATIVEROOT, "$(dir)")/g' > $(basename $<).tmp.styl
	node ./tools/build-css.js $(basename $@).tmp $(basename $<).tmp.styl
	$(NPM_BIN)/borschik $(MINIMIZE_CSS) -i $(basename $@).tmp.css > $(basename $@).css
	$(NPM_BIN)/borschik $(MINIMIZE_CSS) -i $(basename $@).tmp.ie.css > $(basename $@).ie.css

	rm $(basename $<).tmp.styl $(basename $@).tmp.css $(basename $@).tmp.ie.css

$(YATE_BUILT): fullname=$(notdir $(basename $@))
$(YATE_BUILT): name=$(subst .,,$(suffix .$(fullname)))
$(YATE_BUILT): dir=pages/$(shell echo $(fullname) | sed 's/\./\//g')
$(YATE_BUILT): $$(dir)/$$(name).yate $(YATE_BLOCK) node_modules
	@mkdir -p templates
	cat $< | sed 's/{{RELATIVEROOT}}/$(call RELATIVEROOT, "$(dir)")/g' > $<.tmp
	NODE_PATH=$(PLIBS):$(NODE_PATH) $(NPM_BIN)/borschik -t yate -to '{"node": true}' --minimize=false -i $<.tmp -o $@
	rm $<.tmp

$(JSX_SERVER_BUILT): file=$(basename $@)
$(JSX_SERVER_BUILT): path=$(shell echo $(dir $(file)))
$(JSX_SERVER_BUILT): bundle=$(shell echo $(path) | sed 's/react-pages\///' | sed 's/\/$$//')
$(JSX_SERVER_BUILT): $(JSX_BLOCK) node_modules
	$(NPM_BIN)/webpack --config ./tools/webpack.jsx-build.js --page=$(bundle) --type=serverside --langs='$(LANGS)' --env=$(ENV)

$(JSX_CLIENT_BUILT): file=$(basename $@)
$(JSX_CLIENT_BUILT): path=$(shell echo $(dir $(file)))
$(JSX_CLIENT_BUILT): bundle=$(shell echo $(path) | sed 's/react-pages\///' | sed 's/\/$$//')
$(JSX_CLIENT_BUILT): $(JSX_BLOCK) node_modules
	$(NPM_BIN)/webpack --config ./tools/webpack.jsx-build.js --page=$(bundle) --type=clientside --langs='$(LANGS)' --env=$(ENV)


#-------------------------------------------------------------


.PHONY: all client server clean clean-all testfiles codestyle pre-build testonly loc loc-unapproved
