# Конфиги - start
FRONTEND_NODE_GIT?=https://github.yandex-team.ru/partner/yharnam.git
FRONTEND_NODE_PATH=adv/frontend/services/yharnam
FRONTEND_NODE_REF?=trunk
NPM_BIN=node_modules/.bin
ISTANBUL=${NPM_BIN}/istanbul
LMD=${NPM_BIN}/lmd
GRUNT=${NPM_BIN}/grunt
MOCHA=${NPM_BIN}/mocha-phantomjs

CURRENT_DIR=$(patsubst %/,%,$(dir $(abspath $(lastword $(MAKEFILE_LIST)))))
export ARCADIA_ROOT=$(shell arc root)
JAVA_BRANCH?=$(shell arc info --json | jq .remote -r)

ifndef UBUNTU_VERSION
	UBUNTU_VERSION=$(shell lsb_release -sc 2>/dev/null || echo "bionic")
endif

ifneq (${UBUNTU_VERSION}, "precise")
	UBUNTU_VERSION_SUFFIX=-${UBUNTU_VERSION}
endif

ifeq (${JAVA_REBUILD}, 1)
	override JAVA_REBUILD='--rebuild'
else
	override JAVA_REBUILD=''
endif


PARTNER_UID=123
LEGO_IMAGE_CONTENT= \
    .borschik \
	.tanker \
	common.priv.js \
    data \
    lib/QBit/blocks/ \
    lib/QBit/data/ \
    lib/QBit/templates/ \
    blocks \
	frontend \
    templates \
	utils/check_nodejs_version.sh \
    Makefile
IMAGE_CONTENT= \
    Makefile \
	etc \
	errors \
	mail_templates \
	api \
	bin \
	lib \
	locale \
	resources \
	migrations \
	configs/autotest \
	configs/dev \
	configs/test \
	configs/preprod \
	configs/production

.PHONY: xt

# Конфиги - end
export PERL5LIB:="./local/lib/perl5:/usr/share/partners/local/lib/perl5:${PERL5LIB}"
export CPATH=/usr/include/nodejs/deps/v8/include/:/usr/include/zookeeper/:/usr/include/mysql/
export NODE_PATH=/usr/lib/node_modules:

all:
	@echo [`date +"%Y/%m/%d %T"`] Start all
	@mkdir -p nginx
	@echo [`date +"%Y/%m/%d %T"`] Start tanker-sync.pl
	ONLY_DOWNLOAD=1 perl -Ilib -MNet::INET6Glue ./bin/tanker-sync.pl

clean:

.SECONDEXPANSION:

# Code utils
perltidy_full:
	@echo [`date +"%Y/%m/%d %T"`] Start perltidy
	find ./api ./bin ./lib ./t ./t_external -name '*.pl' -o -name '*.pm' -o -name '*.t' -o -name '*.psgi' | xargs -n1 -t -P8 perltidy -w --backup-file-extension=.~tidybkp~
	find ./ -name '*.~tidybkp~' -delete
	find ./api ./bin ./lib ./t ./t_external -name '*.pl' -o -name '*.pm' -o -name '*.t' -o -name '*.psgi' | xargs -n1 -t -P8 whiter

perltidy:
	@echo [`date +"%Y/%m/%d %T"`] Start perltidy
	@arc diff --name-only --cached | perl -nlE 'print $$ENV{ARCADIA_ROOT} . "/$$_" if /(\.t|\.pm|\.pl|\.psgi)\z/' | xargs -n1 -t -P8 perltidy -w --backup-file-extension=.~tidybkp~
	@rm -f `arc diff --name-only --cached | perl -nlE 'print($$ENV{ARCADIA_ROOT} . "$$_.~tidybkp~") if /(\.t|\.pm|\.pl|\.psgi)\z/'`
	@arc diff --name-only --cached | perl -nlE 'print $$ENV{ARCADIA_ROOT} . "/$$_" if /(\.t|\.pm|\.pl|\.psgi)\z/' | xargs -n1 -t -P8 whiter

pretty:
	@echo [`date +"%Y/%m/%d %T"`] Start pretty json
	@arc diff --name-only --cached | perl -I ./lib -Mqbit -ne 'chomp; if (/(\.json)$$/) { my $$file = $$ENV{ARCADIA_ROOT} . "/$$_"; print "$$file\n"; writefile($$file, to_json(from_json(readfile($$file)), pretty => 1)) }'

# LEGO - start
lego: lego_check_node_version
	@echo [`date +"%Y/%m/%d %T"`] Start build lego
	@cd frontend && YENV=production ./node_modules/.bin/grunt build

lego_clean:
	@echo [`date +"%Y/%m/%d %T"`] Start clean lego
	@cd frontend && ./node_modules/.bin/grunt clean
	@rm -rf common.priv.js data/css/_common.*css .tmp data/js/_common.*.js blocks/i-form-render/i-form-render.js data/i/./blocks

lego_install:
	@echo [`date +"%Y/%m/%d %T"`] Start install lego
	@cd frontend && npm install && npm update && ./node_modules/.bin/bower install

lego_watch_test:
	@echo [`date +"%Y/%m/%d %T"`] Start lego watch test
	@cd frontend && ./node_modules/.bin/grunt watch:test

lego_watch:
	@echo [`date +"%Y/%m/%d %T"`] Start lego watch
	@cd frontend && ./node_modules/.bin/grunt watch:build

lego_server:
	@echo [`date +"%Y/%m/%d %T"`] Start lego server
	@cd frontend && YENV=examples ./node_modules/.bin/enb server --port $(port)

lego_check_node_version:
	@utils/check_nodejs_version.sh 6 6
# LEGO - end

# Внутрение цели - start
# (Цели не предназанченный для отдельного запуска - нужно использовать цели из
# следующего раздела)
partner_db_create_sql_show:
	@perl -Ilib -I./local/lib/perl5 -MApplication -e 'my $$app = Application->new(); $$app->pre_run(); print $$app->partner_db->create_sql()'

partner_logs_db_create_sql_show:
	@perl -Ilib -MApplication -e 'my $$app = Application->new(); $$app->pre_run(); print $$app->partner_logs_db->create_sql()'

clickhouse_db_create_sql_show:
	@echo [`date +"%Y/%m/%d %T"`] Start clickhouse create sql
	@perl -Ilib -MApplication -e 'my $$app = Application->new(); $$app->pre_run(); print $$app->clickhouse_db->create_sql()'

partner1_db_create_sql_show:
	@perl -Ilib -MApplication -e 'my $$app = Application->new(); $$app->pre_run(); print $$app->partner1_db->create_sql()'

bk_on_prod:
	@perl -Ilib -MUtils::MakeFile -e 'Utils::MakeFile::set_bk_on_prod()'

balance_on_prod:
	@perl -Ilib -MUtils::MakeFile -e 'Utils::MakeFile::set_balance_on_prod()'

db_on_prod:
	@perl -Ilib -MUtils::MakeFile -e 'Utils::MakeFile::set_db_on_prod()'

db_on_test:
	@perl -Ilib -MUtils::MakeFile -e 'Utils::MakeFile::set_db_on_test()'

ch_on_prod:
	@perl -Ilib -MUtils::MakeFile -e 'Utils::MakeFile::set_ch_on_prod()'

ch_on_test:
	@perl -Ilib -MUtils::MakeFile -e 'Utils::MakeFile::set_ch_on_test()'

yt_on_prod:
	@perl -Ilib -MUtils::MakeFile -e 'Utils::MakeFile::set_yt_on_prod()'

mol_on_prod:
	@perl -Ilib -MUtils::MakeFile -e 'Utils::MakeFile::set_mol_on_prod()'

page_id_generator_on_prod:
	@perl -Ilib -MUtils::MakeFile -e 'Utils::MakeFile::set_page_id_generator_on_prod()'

page_id_generator_on_test:
	@perl -Ilib -MUtils::MakeFile -e 'Utils::MakeFile::set_page_id_generator_on_test()'

create_and_copy_configs: compose_swagger
	@mkdir -p nginx;
	@mkdir -p nginx/chi_file_cache;
	@mkdir -p nginx/partner2_migration;
	@mkdir -p nginx/pi_errors;
	@mkdir -p nginx/publisher_stat;
	@mkdir -p nginx/stat_cache;
	@mkdir -p nginx/pages_dump;
	@mkdir -p nginx/api_logs;

	@rm -f nginx/log4perl.conf.term;

	@cp configs/carton/${UBUNTU_VERSION}/cpanfile  cpanfile
	@cp configs/carton/${UBUNTU_VERSION}/cpanfile.snapshot  cpanfile.snapshot
	@PERL5LIB=./local/lib/perl5  carton install --deployment;

ifeq ("$(UBUNTU_VERSION)", "bionic")
	# Copy JavaScript::V8 to local/lib
	@cp -r configs/default/bionic/libs/JavaScript  local/lib/perl5/x86_64-linux-gnu-thread-multi/;
	@mkdir -p local/lib/perl5/x86_64-linux-gnu-thread-multi/auto/JavaScript/V8/;
	@cp configs/default/bionic/libs/V8.so   local/lib/perl5/x86_64-linux-gnu-thread-multi/auto/JavaScript/V8/V8.so;
endif

	@perl configs/dev/bin/generate_dev_configs.pl
	@cp \
		configs/dev/ssl.conf \
		nginx/
	@chmod a+x nginx/init.sh
	@cp \
	    configs/dev/Application.json \
	    configs/dev/DatabaseConfig.json \
	    configs/dev/WebInterface.json \
	    lib/
    # only after copy configs/dev/Application.json
	@perl -Ilib -MUtils::MakeFile -e 'Utils::MakeFile::set_java_jsonapi_port()'

db_on_docker:
	@perl -Ilib -MUtils::MakeFile -e 'Utils::MakeFile::set_db_on_docker()'

db_on_deploy:
	@perl -Ilib -MUtils::MakeFile -e 'Utils::MakeFile::set_db_on_oneshot()'

db_on_dev:
	@perl -Ilib -MUtils::MakeFile -e 'Utils::MakeFile::delete_db_on_docker()'
	@cp \
	    configs/dev/DatabaseConfig.json \
	    lib/

compose_swagger:
	@echo [`date +"%Y/%m/%d %T"`] Compose swagger.json
	@perl -Ilib -MUtils::Swagger -e 'Utils::Swagger::compose_swagger_json()';

frontend-node:
	@echo [`date +"%Y/%m/%d %T"`] Exporting Node.js frontend. With branch ${FRONTEND_NODE_REF}
	@mkdir frontend-node
	@cd frontend-node && arc init --bare && arc export ${FRONTEND_NODE_REF} ${FRONTEND_NODE_PATH} --to .

frontend_install_nvm:
	@utils/frontend-install-nvm.sh

frontend-node-static: frontend_install_nvm frontend-node
	@echo [`date +"%Y/%m/%d %T"`] Creating Node.js frontend
	@. utils/frontend-node-env.sh && cd frontend-node/${FRONTEND_NODE_PATH} && ENV=testing make beta

create_ctags:
	@echo [`date +"%Y/%m/%d %T"`] Creating ctags
	@find ./lib/ ./t/ ./templates/ -regextype posix-egrep -regex '.*\.(tpl|tt2|pm)' > ./ctag.flist
	@ctags \
	--langdef=tt --langmap=tt:.tmpl.tpl.tt2 --regex-tt='/[^a-zA-Z0-9_]MACRO[ \t]+([a-zA-Z0-9_]+)/\1/m,Macro/' --regex-tt='/[^a-zA-Z0-9_]BLOCK[ \t]+([a-zA-Z0-9_]+)/\1/b,Block/' \
	--regex-perl='/^ +([a-zA-Z_0-9]+) *=> *(.*)->new/\1/d,definition/' \
	--regex-perl="/^\s*use\s+.*\s+accessor\s*=>\s*['\"](.*)['\"]/\1/d,definition/" \
	--langdef=flist --langmap=flist:.flist --regex-flist='/\/([a-zA-Z_]+)\.(tpl|tt2)$$/\1/f,File/' \
	-L ./ctag.flist -f ./tags
	@rm ./ctag.flist
# Внутрение цели - end

hooks_update:
	@arc config pre-commit-hook.partner/perl/partner2.pre-commit $(CURRENT_DIR)/hooks/pre-commit
#	@arc config prepare-commit-msg-hook.partner/perl/partner2.qbit-prepare-commit-msg /usr/bin/qbit-prepare-commit-msg

# Цели которые нужно использовать - start
beta_create: create_and_copy_configs frontend-node-static hooks_update build_java
#	@ONLY_DOWNLOAD=1 perl -Ilib -MNet::INET6Glue ./bin/tanker-sync.pl
	@./nginx/init.sh restart

test:
	@echo [`date +"%Y/%m/%d %T"`] START tests
#	prove -j3 --norc -r -Iconfigs/dev -Ilib -I t/lib -I utils/lib -It_lib --ext=.t --ext=.tjson t/ t_external/
	@echo 'Skip testing'

release:
	@echo [`date +"%Y/%m/%d %T"`] START release
	@tag=`./bin/get_version_from_arc.pl --increase_version` && \
	arc push HEAD:tags/releases/partner/perl/$$tag && \
	echo "[Arc::Tag] Tagged $$tag"

docker_start:
	COMPOSE_HTTP_TIMEOUT=300 docker-compose -p $(BETA_PORT) up -d

docker_stop:
	docker-compose -p $(BETA_PORT) stop && COMPOSE_HTTP_TIMEOUT=300 docker-compose -p $(BETA_PORT) rm --force

docker_build:
	docker-compose -p $(BETA_PORT) build

docker_restart: docker_stop docker_build docker_start

docker_test:
	docker exec $$(docker inspect --format '{{.Name}}' `docker-compose ps -q backend` | perl -nalE 's{^/}{}; say') sh -c "PARTNER2_TEST_DB_HOST=db prove --lib ./lib/ t"

docker_backend_nginx_build:
ifndef BACKEND_DOCKER_IMAGE_VERSION
	$(error BACKEND_DOCKER_IMAGE_VERSION is not set)
endif
	docker build --tag registry.yandex.net/partners/perl-backend-nginx:experimental-$(BACKEND_DOCKER_IMAGE_VERSION) configs/deploy_backend/nginx

docker_teamcity_build:
ifndef TEAMCITY_DOCKER_IMAGE_VERSION
	$(error TEAMCITY_DOCKER_IMAGE_VERSION is not set)
endif
	docker build \
		--file ./configs/func-tests/${UBUNTU_VERSION}/Dockerfile \
		--tag registry.yandex.net/partners/partner-teamcity-agent${UBUNTU_VERSION_SUFFIX}:$(TEAMCITY_DOCKER_IMAGE_VERSION) \
		.

##########
# DEPLOY #
##########

build:
	@perl bin/deploy/build_perl_backend_docker_image.pl --branch=$(BRANCH) --VERSION=$(VERSION)

prepare_content:
	tar cf lego_frontend.tar $(LEGO_IMAGE_CONTENT) --hard-dereference --owner=$(PARTNER_UID) --group=$(PARTNER_UID)
	tar cf perl_backend.tar $(IMAGE_CONTENT) --hard-dereference --owner=$(PARTNER_UID) --group=$(PARTNER_UID)

tar_prepare_content: prepare_content
	tar -czvf ../partner2.tar.gz -C ./ ./

docker_backend_build: prepare_content
ifndef BACKEND_DOCKER_IMAGE_VERSION
	$(error BACKEND_DOCKER_IMAGE_VERSION is not set)
endif
	docker build \
		--file configs/deploy_backend/${UBUNTU_VERSION}/Dockerfile \
		--tag registry.yandex.net/partners/perl-backend${UBUNTU_VERSION_SUFFIX}:$(BACKEND_DOCKER_IMAGE_VERSION) \
		--build-arg VERSION=$(BACKEND_DOCKER_IMAGE_VERSION) .
	@echo "BACKEND_IMAGE_FULL_NAME=registry.yandex.net/partners/perl-backend${UBUNTU_VERSION_SUFFIX}:$(BACKEND_DOCKER_IMAGE_VERSION)"

push_image:
ifndef BACKEND_IMAGE_FULL_NAME
	$(error BACKEND_IMAGE_FULL_NAME is not set)
endif
	docker push $(BACKEND_IMAGE_FULL_NAME)

build_java:
	@perl ./bin/build_java.pl --dir=$(PWD) --branch=$(JAVA_BRANCH) $(JAVA_REBUILD)

generate_sql_for_java:
	bin/generate_sql_for_java.sh

docker_base_backend_build:
	@perl ./bin/build_base_docker_image.pl  --ubuntu_version=${UBUNTU_VERSION}

docker_backend_services_build:
ifndef BACKEND_SERVICES_DOCKER_IMAGE_VERSION
	$(error BACKEND_SERVICES_DOCKER_IMAGE_VERSION is not set)
endif
	docker build \
		--file configs/docker/backend_services/Dockerfile \
		--tag registry.yandex.net/partners/backend-services:$(BACKEND_SERVICES_DOCKER_IMAGE_VERSION) .
	@echo "BACKEND_SERVICES_IMAGE_FULL_NAME=registry.yandex.net/partners/backend-services:$(BACKEND_SERVICES_DOCKER_IMAGE_VERSION)"

kill_api_fcgi:
	@perl bin/deploy/kill_process.pl --name=api_fcgi

kill_frontend_node:
	@perl bin/deploy/kill_process.pl --name=frontend_node

kill_intapi_fcgi:
	@perl bin/deploy/kill_process.pl --name=intapi_fcgi

kill_interface_fcgi:
	@perl bin/deploy/kill_process.pl --name=interface_fcgi

kill_nginx:
	@perl bin/deploy/kill_process.pl --name=nginx

kill_rest_api:
	@perl bin/deploy/kill_process.pl --name=rest_api

kill_rosetta_server:
	@perl bin/deploy/kill_process.pl --name=rosetta_server

##############
# DEPLOY END #
##############

config_oneshot_deploy_db: create_and_copy_configs
	@perl -Ilib -MUtils::MakeFile -e 'Utils::MakeFile::setup_db_on_oneshot()'

config_oneshot_keep_local:
	@echo "keep current config"

config_dev: create_and_copy_configs db_on_dev

config_docker: create_and_copy_configs db_on_docker

config_test: create_and_copy_configs db_on_test

config_production: create_and_copy_configs bk_on_prod balance_on_prod db_on_prod ch_on_prod yt_on_prod page_id_generator_on_prod mol_on_prod
	@echo "Attention: all connection now to prod"
