set(NOVASVG_TEST_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})

set(NOVASVG_TEST_BINARY_DIR ${CMAKE_BINARY_DIR}/tests)
set(NOVASVG_COVERAGE_BINARY_DIR ${CMAKE_BINARY_DIR}/coverage)

set(NOVASVG_COVERAGE_TOTAL_BINARY_DIR ${NOVASVG_COVERAGE_BINARY_DIR}/total)
set(NOVASVG_COVERAGE_CPP_BINARY_DIR ${NOVASVG_COVERAGE_BINARY_DIR}/cpp)
set(NOVASVG_COVERAGE_PYTHON_BINARY_DIR ${NOVASVG_COVERAGE_BINARY_DIR}/python)

file(REMOVE_RECURSE ${NOVASVG_COVERAGE_BINARY_DIR})
file(MAKE_DIRECTORY ${NOVASVG_COVERAGE_BINARY_DIR})

add_custom_target(novasvg_test
    COMMAND ${CMAKE_COMMAND} -E echo "-- Running All tests..."
)

add_custom_target(novasvg_coverage
    COMMAND ${CMAKE_COMMAND} -E echo "-- Running coverage for all languages ..."
)


find_package(Python3 COMPONENTS Interpreter REQUIRED)
find_program(LCOV_EXECUTABLE lcov)
find_program(GENHTML_EXECUTABLE genhtml)

add_subdirectory(${NOVASVG_TEST_SOURCE_DIR}/cpp)
add_subdirectory(${NOVASVG_TEST_SOURCE_DIR}/python)

if(TARGET novasvg_coverage_cpp AND TARGET novasvg_coverage_python)
    if(LCOV_EXECUTABLE AND GENHTML_EXECUTABLE)
        add_custom_target(novasvg_coverage_total
                # Clean previous coverage data
            COMMAND ${CMAKE_COMMAND} -E remove_directory ${NOVASVG_COVERAGE_TOTAL_BINARY_DIR}
            COMMAND ${CMAKE_COMMAND} -E make_directory ${NOVASVG_COVERAGE_TOTAL_BINARY_DIR}/html
            # Merge C++ and Python coverage info files
            COMMAND ${CMAKE_COMMAND} -E echo "-- Merging C++ and Python coverage..."
            COMMAND ${LCOV_EXECUTABLE}
                    --add-tracefile ${NOVASVG_COVERAGE_CPP_BINARY_DIR}/coverage.lcov
                    --add-tracefile ${NOVASVG_COVERAGE_PYTHON_BINARY_DIR}/coverage.lcov
                    --output-file ${NOVASVG_COVERAGE_TOTAL_BINARY_DIR}/coverage.lcov
            COMMAND ${CMAKE_COMMAND} -E echo "-- Total coverage info created at: ${NOVASVG_COVERAGE_TOTAL_BINARY_DIR}/coverage.lcov"
                    
            # Generate HTML report
            COMMAND ${CMAKE_COMMAND} 
                -DCOV_FILE=${NOVASVG_COVERAGE_TOTAL_BINARY_DIR}/coverage.lcov
                -DPREFIX_PATH=${PROJECT_SOURCE_DIR}/
                -P ${PROJECT_SOURCE_DIR}/cmake/FixLCovPaths.cmake
            COMMAND ${CMAKE_COMMAND} -E echo "-- Generating HTML report..."
            COMMAND ${GENHTML_EXECUTABLE} --quiet 
                    ${NOVASVG_COVERAGE_TOTAL_BINARY_DIR}/coverage.lcov
                    --output-directory ${NOVASVG_COVERAGE_TOTAL_BINARY_DIR}/html
                    --prefix ${PROJECT_SOURCE_DIR}
                    --title "Novasvg Total Coverage"
                    --css-file ${NOVASVG_TEST_SOURCE_DIR}/genhtml.css
                    --dark-mode 
            COMMAND ${CMAKE_COMMAND} 
                -DCOV_FILE=${NOVASVG_COVERAGE_TOTAL_BINARY_DIR}/coverage.lcov
                -DSOURCE_PATH=${PROJECT_SOURCE_DIR}/
                -P ${PROJECT_SOURCE_DIR}/cmake/FixLCovPaths.cmake
            COMMAND ${CMAKE_COMMAND} -E echo "-- HTML entry point created here: ${NOVASVG_COVERAGE_TOTAL_BINARY_DIR}/html/index.html"
        
            WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
            USES_TERMINAL
        )

        # Ensure this target runs only after both individual coverages are done
        add_dependencies(novasvg_coverage_total novasvg_coverage_cpp)
        add_dependencies(novasvg_coverage_total novasvg_coverage_python)

        add_dependencies(novasvg_coverage novasvg_coverage_total)
    endif()
endif()

# --- Generate Coverage Dashboard HTML ---
# Initialize the JSON array
set(COVERAGE_DATA_JSON "[")

# Check for Total Coverage (Merged)
if(TARGET novasvg_coverage_total)
    set(COVERAGE_DATA_JSON "${COVERAGE_DATA_JSON}
        {
            \"id\": \"total\",
            \"title\": \"Total Coverage\",
            \"badge\": \"Merged\",
            \"badgeClass\": \"total\",
            \"color\": \"#a371f7\",
            \"desc\": \"Combined coverage report for both C++ and Python codebases. Useful for SonarQube analysis.\",
            \"htmlLink\": \"total/html/index.html\", 
            \"lcovLink\": \"total/coverage.lcov\"
        },")
endif()

# Check for C++ Coverage
if(TARGET novasvg_coverage_cpp)
    set(COVERAGE_DATA_JSON "${COVERAGE_DATA_JSON}
        {
            \"id\": \"cpp\",
            \"title\": \"C++ Core\",
            \"badge\": \"Native\",
            \"color\": \"#f0883e\",
            \"desc\": \"Detailed coverage report for the core C++ library, including headers and implementation files generated by LCOV.\",
            \"htmlLink\": \"cpp/html/index.html\",
            \"lcovLink\": \"cpp/coverage.lcov\"
        },")
endif()

# Check for Python Coverage
if(TARGET novasvg_coverage_python)
    set(COVERAGE_DATA_JSON "${COVERAGE_DATA_JSON}
        {
            \"id\": \"py\",
            \"title\": \"Python Bindings\",
            \"badge\": \"Interpreter\",
            \"color\": \"#3572A5\",
            \"desc\": \"Coverage analysis for Python bindings and high-level logic, generated by coverage.py.\",
            \"htmlLink\": \"python/html/index.html\",
            \"lcovLink\": \"python/coverage.lcov\"
        },")
endif()

# Remove the trailing comma if the list is not empty, then close the array
string(LENGTH "${COVERAGE_DATA_JSON}" JSON_LEN)
if(JSON_LEN GREATER 1)
    string(REGEX REPLACE ",$" "" COVERAGE_DATA_JSON "${COVERAGE_DATA_JSON}")
endif()

set(COVERAGE_DATA_JSON "${COVERAGE_DATA_JSON}]")
# Configure the HTML file
configure_file(
    ${NOVASVG_TEST_SOURCE_DIR}/coverage_dashboard.html.in
    ${NOVASVG_COVERAGE_BINARY_DIR}/index.html
    @ONLY
)