# 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.

# Compiler and flags
CXX = g++
CXXFLAGS = -std=c++17 -Wall -Wextra -O2 -g
INCLUDES = -I../include -I.
LIBS = -lopendal_c -luuid

# Source files
FRAMEWORK_SOURCES = test_framework.cpp
SUITE_SOURCES = test_suites_basic.cpp test_suites_list.cpp test_suites_reader_writer.cpp
RUNNER_SOURCES = test_runner.cpp
ALL_SOURCES = $(FRAMEWORK_SOURCES) $(SUITE_SOURCES) $(RUNNER_SOURCES)

# Object files
OBJECTS = $(ALL_SOURCES:.cpp=.o)

# Target executable
TARGET = opendal_test_runner
EXAMPLE_TARGET = example_test

# Library path (adjust as needed)
LIBPATH = -L../target/debug -L../build

.PHONY: all clean test help example behavior_test

all: $(TARGET)

$(TARGET): $(OBJECTS)
	$(CXX) $(CXXFLAGS) -o $@ $^ $(LIBPATH) $(LIBS)

$(EXAMPLE_TARGET): example_test.o test_framework.o
	$(CXX) $(CXXFLAGS) -o $@ $^ $(LIBPATH) $(LIBS)

%.o: %.cpp
	$(CXX) $(CXXFLAGS) $(INCLUDES) -c $< -o $@

example: $(EXAMPLE_TARGET)
	@echo "Running example test..."
	./$(EXAMPLE_TARGET)

behavior_test: $(TARGET)
	@echo "Running OpenDAL C binding behavior tests..."
	LD_LIBRARY_PATH=../target/debug:$$LD_LIBRARY_PATH ./$(TARGET)

test: behavior_test

test-memory: $(TARGET)
	@echo "Running tests with memory service..."
	LD_LIBRARY_PATH=../target/debug:$$LD_LIBRARY_PATH OPENDAL_TEST=memory ./$(TARGET)

test-fs: $(TARGET)
	@echo "Running tests with filesystem service..."
	@mkdir -p /tmp/opendal_test
	LD_LIBRARY_PATH=../target/debug:$$LD_LIBRARY_PATH OPENDAL_TEST=fs OPENDAL_FS_ROOT=/tmp/opendal_test ./$(TARGET)
	@rm -rf /tmp/opendal_test

list-suites: $(TARGET)
	LD_LIBRARY_PATH=../target/debug:$$LD_LIBRARY_PATH ./$(TARGET) --list-suites

clean:
	rm -f $(OBJECTS) $(TARGET) $(EXAMPLE_TARGET) example_test.o

help:
	@echo "Available targets:"
	@echo "  all          - Build the test runner"
	@echo "  behavior_test - Run behavior tests (main target)"
	@echo "  test         - Alias for behavior_test"
	@echo "  example      - Build and run example test"
	@echo "  test-memory  - Run tests with memory service"
	@echo "  test-fs      - Run tests with filesystem service"
	@echo "  list-suites  - List all available test suites"
	@echo "  clean        - Remove compiled files"
	@echo "  help         - Show this help message"
	@echo ""
	@echo "Usage examples:"
	@echo "  OPENDAL_TEST=memory make behavior_test"
	@echo "  OPENDAL_TEST=fs OPENDAL_FS_ROOT=/tmp/test make behavior_test"
	@echo ""
	@echo "Environment variables:"
	@echo "  OPENDAL_TEST                 - Service to test (memory, fs, s3, etc.)"
	@echo "  OPENDAL_DISABLE_RANDOM_ROOT  - Set to 'true' to disable random root"
	@echo "  OPENDAL_<SERVICE>_<CONFIG>   - Service-specific configuration"

# Dependencies
test_framework.o: test_framework.h
test_suites_basic.o: test_framework.h
test_suites_list.o: test_framework.h
test_suites_reader_writer.o: test_framework.h
test_runner.o: test_framework.h 