DIRECT_MK=direct-mk

ifneq (,$(findstring ppcdev,$(shell uname -n)))
	IS_PPC_DEV=1
endif

.PHONY: help
help: ## Выводит справку по командам makefile
	@cat $(MAKEFILE_LIST) | grep -e "^[a-zA-Z_\-]*: *.*## *" | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'

.PHONY: schema-docs
schema-docs: ## Сборка документации по схемам
	(cd node_modules/schema-docs && npm i)
	node node_modules/schema-docs/schema-docs-builder.js node_modules/lego/bem-bl/ node_modules/bem-components/ node_modules/islands-components/ /data3/

# ##########################################################
# Шорткат выкачивания зависимостей и сборки основного бандла

.PHONY: all
all: ## Шорткат выкачивания зависимостей и сборки основного бандла
	make deps
	make convert-const
	make convert-common-i18n
	make direct-for-robots
	make direct-touch-for-robots
	make morda-for-robots
	make head-for-robots
	$(MAKE) js-templater-restart
	$(MAKE) lint.modified

.PHONY: all-for-robots
all-for-robots: ## Шорткат выкачивания зависимостей и сборки основного бандла. Для запуска роботами
	make deps
	make convert-const
	make convert-common-i18n
	make direct-for-robots
	make direct-touch-for-robots
	make morda-for-robots
	make head-for-robots

# ##########################################################
# Cборка основного бандла

# Переменной PAGE_BLOCK задает пейджевые блок/блоки для сборки бандла
# PAGE_BLOCK=p-campaign,p-multiedit2 make direct
.PHONY: direct-for-robots
direct-for-robots: ## Сборка основного бандла для роботов
	node_modules/.bin/enb make -n desktop.bundles/direct
	utils/check-bundle-files.sh desktop.bundles/direct

# Переменной PAGE_BLOCK задает пейджевые блок/блоки для сборки бандла
# PAGE_BLOCK=p-campaign,p-multiedit2 make direct
.PHONY: direct-touch-for-robots
direct-touch-for-robots: ## Сборка основного тач бандла для роботов
	node_modules/.bin/enb make -n touch.bundles/direct
	utils/check-bundle-files.sh touch.bundles/direct

# Переменной PAGE_BLOCK задает пейджевые блок/блоки для сборки бандла
# PAGE_BLOCK=p-morda make direct
.PHONY: morda-for-robots
morda-for-robots: ## Сборка бандла morda для роботов
	node_modules/.bin/enb make -n desktop.bundles/morda
	utils/check-bundle-files.sh desktop.bundles/morda

# Переменной PAGE_BLOCK задает пейджевые блок/блоки для сборки бандла
# PAGE_BLOCK=p-campaign,p-multiedit2 make direct
.PHONY: direct
direct: ## Сборка основного бандла для людей
	node_modules/.bin/enb make desktop.bundles/direct
	make fixsvg
	make fixpng.modified
	make hash
	$(MAKE) js-templater-restart
	$(MAKE) lint.modified
	utils/check-bundle-files.sh desktop.bundles/direct

# Переменной PAGE_BLOCK задает пейджевые блок/блоки для сборки бандла
# PAGE_BLOCK=p-campaign,p-multiedit2 make direct
.PHONY: direct-touch
direct-touch: ## Сборка основного бандла для людей
	node_modules/.bin/enb make touch.bundles/direct
	make fixsvg
	make fixpng.modified
	make hash
	$(MAKE) js-templater-restart
	$(MAKE) lint.modified
	utils/check-bundle-files.sh touch.bundles/direct

# Переменной PAGE_BLOCK задает пейджевые блок/блоки для сборки бандла
# PAGE_BLOCK=p-morda make direct
.PHONY: morda
morda: ## Сборка бандла morda для людей
	node_modules/.bin/enb make desktop.bundles/morda
	make fixsvg
	make fixpng.modified
	make hash
	$(MAKE) js-templater-restart
	$(MAKE) lint.modified
	utils/check-bundle-files.sh touch.bundles/morda

.PHONY: hash
hash: ## Обновление hash сумм файлов статики + перезапуск (перезагрузка) apache
ifdef IS_PPC_DEV
	$(DIRECT_MK) static_file_hashsums
	$(DIRECT_MK) reload
endif

# Выполняет установку зависимостей, указанных в package.json с помощью zlo
# На локальнои маке будет устанавливаться из внешних источников (GIT, SVN, NPM, etc).
# На бетах будет пытаться устанавливать зависимости из хранилища, а так же
# добавить новые зависимости в хранилище.
# Для работы неободим глобально установленый NPM пакет zlo
# https://github.com/direct-adv-interfaces/zlo
# Информация в вики - https://wiki.yandex-team.ru/users/heliarian/zlo.js/
.PHONY: deps
deps: ## Выкачивание зависимостей
	npm ci
	node_modules/.bin/prettier --with-node-modules --write "node_modules/islands/common.blocks/user2/**.js" --single-quote
	node_modules/.bin/prettier --with-node-modules --write "node_modules/islands/common.blocks/user2/**/*.js" --single-quote

.PHONY: deps-teamcity
deps-teamcity: ## Выкачивание зависимостей для CI (без кэширования в SVN)
	npm ci
	$(warning "Use „make deps“ instead")

.PHONY: deps-local
deps-local: ## Собирает зависимости при помощи локального zlo
	npm ci
	$(warning "Use „make deps“ instead")

.PHONY: zlo-local
zlo-local: ## Устанавливает zlo из git-репозитория в локальной папке на бете
	$(warning "Zlo has been deprecated, use „make deps“ instead")

.PHONY: kill-deps
kill-deps: # Удаление зависимостей для конкретной сборки#
	rm -rf node_modules
	$(warning "Zlo has been deprecated, use „make deps“ instead")

.PHONY: kill-all-deps
kill-all-deps: ## Удаление всех закешированных зависимостей
	rm -rf node_modules
	$(warning "Zlo has been deprecated, use „make deps“ instead")

.PHONY: dev-server-tests
dev-server-tests: ## Запустить dev-server для тестов (необходимо указать параметры TARGET_BLOCK и BETA_PORT)
	node node_modules/direct-dev/lib/walker-cli -p test-bundles -b $(TARGET_BLOCK)
	ENB_MODE=tests node node_modules/direct-dev-server -b $(TARGET_BLOCK) -p $(BETA_PORT) -h 127.0.0.9 -d https://$(BETA_PORT).beta1.direct.yandex.ru -t ?.test.html

.PHONY: dev-server-sandbox
dev-server-sandbox: ## Запустить dev-server для песочницы (необходимо указать параметры TARGET_BLOCK и BETA_PORT)
	node node_modules/direct-dev/lib/walker-cli -p sandbox-bundles -b $(TARGET_BLOCK)
	ENB_MODE=tests node node_modules/direct-dev-server -b $(TARGET_BLOCK) -p $(BETA_PORT) -h 127.0.0.9 -d https://$(BETA_PORT).beta1.direct.yandex.ru -t ?.sandbox.html

.PHONY: separated-tests
separated-tests: ## Сборка тестовых бандлов по блокам
	node node_modules/direct-dev/lib/walker-cli -p test-bundles -b $(TARGET_BLOCK)
	ENB_MODE=tests node_modules/.bin/enb make
	node node_modules/direct-dev/lib/walker-cli -p test-touch-bundles -b $(TARGET_BLOCK)
	ENB_MODE=tests node_modules/.bin/enb make
	node node_modules/direct-dev/lib/walker-cli -p test-report-console -b $(TARGET_BLOCK)

.PHONY: coverage-stats
coverage-stats: ## Отчет о покрытии тестами
	node node_modules/direct-dev/lib/walker-cli -p test-bundles-coverage -b $(TARGET_BLOCK)
	ENB_MODE=tests node_modules/.bin/enb make
	node node_modules/direct-dev/lib/walker-cli -p test-touch-bundles-coverage -b $(TARGET_BLOCK)
	ENB_MODE=tests node_modules/.bin/enb make
	node node_modules/direct-dev/lib/walker-cli -p coverage-report-console -b $(TARGET_BLOCK)

.PHONY: separated-tests-teamcity
separated-tests-teamcity: ## Сборка тестовых бандлов по блокам - для запуска через teamcity
	##teamcity[blockOpened name='Build test bundles']
	node node_modules/direct-dev/lib/walker-cli -p test-bundles-coverage -b $(TARGET_BLOCK)
	ENB_MODE=tests node_modules/.bin/enb make
	##teamcity[blockClosed name='Build test bundles']
	node node_modules/direct-dev/lib/walker-cli -p test-report-teamcity -b $(TARGET_BLOCK)
	node node_modules/direct-dev/lib/walker-cli -p coverage-report-teamcity -b $(TARGET_BLOCK)
	node node_modules/direct-dev/lib/walker-cli -p coverage-report-html -b $(TARGET_BLOCK)
	##teamcity[blockOpened name='Build coverage archieve']
	cd lcov-report ; zip -r ../coverage.zip *.*
	##teamcity[blockClosed name='Build coverage archieve']

# Работает только на бете
# Вызывает скрипт protected/maintenance/export_consts_to_js.pl, который генерирует файл
# desktop.blocks/i-conts/i-const.js, содержащий константы.
.PHONY: i-const
i-const: ## Генерирование js-файла с константами
	(cd .. && compile_mo.pl -locale_path locale/ -project_id direct && protected/maintenance/export_consts_to_js.pl)
	 make convert-const

.PHONY: convert-const
convert-const: ## Конвертация констант
	 cp desktop.blocks/i-const/i-const.js.ru desktop.blocks/i-const/i-const.js.by
	 cp desktop.blocks/i-const/i-const.js.ru desktop.blocks/i-const/i-const.js.kz
	 cp desktop.blocks/i-const/i-const.js.ru test.blocks/i-const/i-const.js.ru

.PHONY: fixcss
fixcss: ## Исправление css файлов в соответствии с принятым стилем
	node_modules/.bin/csscomb desktop.blocks
	node_modules/.bin/csscomb touch.blocks

.PHONY: fixsvg
fixsvg: ## Оптимизация svg
	find desktop.blocks -name '*.svg'|xargs -n1 wc -l|awk '{if($$1 > 1) print ($$2)}'|xargs -n1 node_modules/svgo/bin/svgo
	find touch.blocks -name '*.svg'|xargs -n1 wc -l|awk '{if($$1 > 1) print ($$2)}'|xargs -n1 node_modules/svgo/bin/svgo

.PHONY: fixpng
fixpng: ## Оптимизация png
	find desktop.blocks -name '*.png'|xargs -n1 -I FILE node_modules/.bin/zopflipng -y -m --lossy_8bit --lossy_transparent --keepchunks=cHRM,gAMA,pHYs,iCCP,sRGB,oFFs,sTER FILE FILE
	find touch.blocks -name '*.png'|xargs -n1 -I FILE node_modules/.bin/zopflipng -y -m --lossy_8bit --lossy_transparent --keepchunks=cHRM,gAMA,pHYs,iCCP,sRGB,oFFs,sTER FILE FILE

.PHONY: fixpng.modified
fixpng.modified: ## Оптимизация измененных по мнению svn png
	utils/filter-working-copy-files.sh \.png|xargs -n1 -I FILE node_modules/.bin/zopflipng -y -m --lossy_8bit --lossy_transparent --keepchunks=cHRM,gAMA,pHYs,iCCP,sRGB,oFFs,sTER FILE FILE

.PHONY: lint
lint: ## Запуск линтера
	utils/convert-help/check-help.sh
	utils/validate-js.sh $(LINT_PATH_JS)
	utils/validate-css.sh $(LINT_PATH_CSS)
	node utils/check-stringify.js
	node utils/check-bemhtml-apply.js
	node utils/check-iglobal.js
	utils/check-md.sh
	node utils/check-functions.js
	utils/check-bricks.sh
	utils/check-forbidden-blocks.sh
	make check-translations

.PHONY: lint-teamcity
lint-teamcity: ## Запуск линтера для teamcity
	export BUILD_ENV=teamcity && make lint

.PHONY: orfo
orfo: ## Запуск линтера орфографии
	node utils/yaspeller.js

.PHONY: check-functions
check-functions: ## Запуск проверки использования перловых функций
	node utils/check-functions.js

.PHONY: fix-md-mime-type
fix-md-mime-type: ## Исправление mime-type у md файлов
	utils/fix-md-mime-type.sh

.PHONY: lint.modified
lint.modified: ## Запуск линтера на файлы, не включающие немодифицированные js и css файлы
	$(eval export LINT_PATH_JS = "$(shell utils/filter-working-copy-files.sh \.js$$)")
	$(eval export LINT_PATH_CSS = "$(shell utils/filter-working-copy-files.sh \.css$$)")
	$(MAKE) lint || true
	$(MAKE) orfo || true
	$(MAKE) check-functions || true

.PHONY: tests.standalone
tests.standalone: deps i-const lint separated-tests ## Запуск тестов для buildbot, включает в себя все необходимые для этого действия

.PHONY: regions-tree
regions-tree: ## формирование файла дерева регионов
	node utils/build-i-regions.js

.PHONY: generate-lodash
generate-lodash: ## Обновляет файлы desktop.blocks/i-utils/lodash.custom.js и desktop.blocks/i-utils/i-utils__lodash.test.js в соответствии с найденными использованиями u._.*
	utils/generate-lodash.sh

.PHONY: browser-stat
browser-stat: ## Обновляет файл browser-stat.js со статистикой браузеров из метрики
	node utils/update-browser-stat.js

.PHONY: success-story
success-story: ## Обновляет истории успеха из бункера
	node utils/success-stories/success-stories.js

.PHONY: head-for-robots
head-for-robots: ## Сборка шапки для tt2 для роботов
	node_modules/.bin/enb make desktop.bundles/head
	utils/check-bundle-files.sh desktop.bundles/head

.PHONY: head
head: ## Сборка шапки для tt2 для людей
	node_modules/.bin/enb make desktop.bundles/head
	make hash
	$(MAKE) js-templater-restart
	$(MAKE) lint.modified
	utils/check-bundle-files.sh desktop.bundles/head

.PHONY: js-templater-restart
js-templater-restart: ## Перезапуск сервиса шаблонизации
ifdef IS_PPC_DEV
	$(DIRECT_MK) js-templater-restart
endif

.PHONY: check-translations
check-translations: ## Дополнение файлов локализации фразами из исходного кода
	node utils/iget-generate-translations/runner.js

.PHONY: common-i18n
common-i18n: ## Сборка common-i18n
	(cd .. && protected/maintenance/generate_i18n_jsons.pl)
	make convert-common-i18n

.PHONY: convert-common-i18n
convert-common-i18n: ## Корвертация common-i18n в нужный формат
	node utils/generate-programmatic-translations.js

.PHONY: tanker
tanker: ## Обновление переводов
	rm -rf .tanker/map.json
	node_modules/tanker-kit/bin/tanker push
	node_modules/tanker-kit/bin/tanker pull
	utils/add-i18n.sh

.PHONY: tanker-push
tanker-push: ## Отправить новые ключи из кода в ветку в танкере + создать/обновить тикет на переводы
	rm -rf .tanker/map.json
	utils/update-pilot-secrets
	node_modules/tanker-pilot/bin/tanker-pilot push

.PHONY: tanker-pull
tanker-pull: ## Обновление локальных переводов из ветки в танкере
# 	rm -rf .tanker/map.json
	utils/update-pilot-secrets
	node_modules/tanker-pilot/bin/tanker-pilot pull
	utils/add-i18n.sh

.PHONY: tanker-merge
tanker-merge: ## Влитие переводов из ветки в мастер танкера
	rm -rf .tanker/map.json
	utils/update-pilot-secrets
	node_modules/tanker-pilot/bin/tanker-pilot merge

.PHONY: tanker-merge-force
tanker-merge-force: ## Влитие переводов из ветки в мастер танкера без проверки статуса тикета
	rm -rf .tanker/map.json
	utils/update-pilot-secrets
	node_modules/tanker-pilot/bin/tanker-pilot merge --force

.PHONY: pcode-ver-up
pcode-ver-up: ## Обновление версии партнерского кода
	utils/pcode-ver-up.sh
