# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

all: generate

generate:
	@if ! command -v curl &> /dev/null; then \
		echo "curl could not be found, please install curl."; \
		exit 1; \
	fi

	@if ! command -v thrift &> /dev/null; then \
		echo "thrift could not be found, please install thrift 0.15.0"; \
		exit 1; \
	fi

	@if [[ "`thrift --version|grep -o '0.15.[0-9]'`" == "" ]]; then \
		echo "please install thrift 0.15.0"; \
		exit 1; \
	fi

	@if [ -f "../thrift/src/main/thrift/rpc.thrift" ]; then \
		thrift -out . -gen go ../thrift/src/main/thrift/rpc.thrift; \
	else \
		curl -o rpc.thrift https://raw.githubusercontent.com/apache/iotdb/master/thrift/src/main/thrift/rpc.thrift; \
		thrift -out . -gen go rpc.thrift; \
		rm -f rpc.thrift; \
	fi
	@rm -rf rpc/t_s_i_service-remote

.PHONY: generate all test e2e_test e2e_test_clean

test:
	go test -v ./client/...

e2e_test:
	sh -c "cd /tmp/ && rm -rf iotdb && git clone https://github.com/apache/iotdb.git && cd iotdb && mvn clean package -pl distribution -am -DskipTests"
	mkdir -p target/iotdb
	unzip -o -q /tmp/iotdb/distribution/target/apache-iotdb-*-all-bin.zip -d target
	mv target/*/* target/iotdb
	docker-compose -f test/e2e/docker-compose.yml up --build --abort-on-container-exit --remove-orphans

e2e_test_clean:
	rm -rf /tmp/iotdb target
	docker-compose -f test/e2e/docker-compose.yml down

#only used for project structure that the iotdb main project is in the parent folder of this project.
e2e_test_for_parent_git_repo:
	mkdir -p target/iotdb
	unzip -o -q ../distribution/target/apache-iotdb-*-all-bin.zip -d target
	mv target/*/* target/iotdb
	docker-compose -f test/e2e/docker-compose.yml up --build --abort-on-container-exit --remove-orphans

e2e_test_clean_for_parent_git_repo:
	rm -rf target
	docker-compose -f test/e2e/docker-compose.yml down
