.PHONY : all test dependencies clean veryclean lint js css font

NODE_MODULES := node_modules/.bin
BOWER_COMPONENTS := bower_components

all: lint js css test
js: dist/sequence-diagram-min.js dist/sequence-diagram-raphael-min.js dist/sequence-diagram-snap-min.js
css: dist/sequence-diagram-min.css font
font: dist/danielbd.woff2 dist/danielbd.woff

node_modules: package.json
	#
	# NPM update needed.
	#
	npm update
	touch $@

bower_components: bower.json
	#
	# Bower update needed.
	#
	$(NODE_MODULES)/bower update
	touch $@

dependencies: node_modules bower_components

clean:
	-rm build/*
	-git checkout -- dist

veryclean: clean
	-rm -rf node_modules
	-rm -rf bower_components

lint: dependencies package.json bower.json
	$(NODE_MODULES)/jshint --verbose src/*.js
	$(NODE_MODULES)/jshint --verbose test/*.js
	$(NODE_MODULES)/jsonlint package.json -q
	$(NODE_MODULES)/jsonlint bower.json -q

	$(NODE_MODULES)/jsonlint .jscsrc -q
	$(NODE_MODULES)/jscs --fix src/*.js
	$(NODE_MODULES)/jscs --fix test/*.js

test: dependencies dist/sequence-diagram-min.js

	# Test the un-minifed file (with underscore)
	$(NODE_MODULES)/qunit \
		-c dist/sequence-diagram.js \
		-t test/*-tests.js \
		-d test/*-mock.js $(BOWER_COMPONENTS)/underscore/underscore-min.js

	# Test the un-minifed file (with lodash)
	$(NODE_MODULES)/qunit \
		-c dist/sequence-diagram.js \
		-t test/*-tests.js \
		-d test/*-mock.js $(BOWER_COMPONENTS)/lodash/dist/lodash.min.js

	# Test the minifed file (with underscore)
	$(NODE_MODULES)/qunit \
		-c dist/sequence-diagram-min.js \
		-t test/*-tests.js \
		-d test/*-mock.js $(BOWER_COMPONENTS)/underscore/underscore-min.js

	# Test the minifed file (with lodash)
	$(NODE_MODULES)/qunit \
		-c dist/sequence-diagram-min.js \
		-t test/*-tests.js \
		-d test/*-mock.js $(BOWER_COMPONENTS)/lodash/dist/lodash.min.js

build/grammar.js: src/grammar.jison
	mkdir -p build
	$(NODE_MODULES)/jison $< -o $@.tmp

	# After building the grammar, run it through the uglifyjs to fix some non-strict issues.
	# Until https://github.com/zaach/jison/issues/285 is fixed, we must do this to create valid non-minified code.
	$(NODE_MODULES)/uglifyjs \
		$@.tmp -o $@ \
		--comments all --compress --beautify

	rm $@.tmp

# Compile the grammar
build/diagram-grammar.js: src/diagram.js build/grammar.js
	$(NODE_MODULES)/preprocess $< . > $@

# Combine all javascript files together (Raphael and Snap.svg)
dist/sequence-diagram.js: src/main.js build/diagram-grammar.js src/jquery-plugin.js src/sequence-diagram.js src/theme.js src/theme-snap.js src/theme-raphael.js fonts/daniel/daniel_700.font.js
	mkdir -p dist
	$(NODE_MODULES)/preprocess $< . -SNAP=true -RAPHAEL=true  > $@

# Combine just Raphael theme
dist/sequence-diagram-raphael.js: src/main.js build/diagram-grammar.js src/jquery-plugin.js src/sequence-diagram.js src/theme.js src/theme-raphael.js fonts/daniel/daniel_700.font.js
	$(NODE_MODULES)/preprocess $< . -RAPHAEL=true > $@

# Combine just Snap.svg theme
dist/sequence-diagram-snap.js: src/main.js build/diagram-grammar.js src/jquery-plugin.js src/sequence-diagram.js src/theme.js src/theme-snap.js
	$(NODE_MODULES)/preprocess $< . -SNAP=true > $@

dist/sequence-diagram.css: src/sequence-diagram.css
	cp $< $@

# Minify the CSS
dist/sequence-diagram-min.css: dist/sequence-diagram.css
	$(NODE_MODULES)/minify --output $@ $<

# Move some fonts TODO optomise the fonts
dist/%.woff: fonts/daniel/%.woff
	cp $< $@

dist/%.woff2: fonts/daniel/%.woff2
	cp $< $@

# Minify the final javascript
dist/%-min.js dist/%-min.js.map: dist/%.js

	#
	# Please ignore the warnings below (these are in combined js code)
	#
	$(NODE_MODULES)/uglifyjs \
		$< -o $@ \
		--compress --comments --lint \
		--source-map $@.map \
		--source-map-url `basename $<`
