set(URLPARSER_TEST_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR})

set(URLPARSER_TEST_BINARY_DIR ${CMAKE_BINARY_DIR}/tests)
set(URLPARSER_COVERAGE_BINARY_DIR ${CMAKE_BINARY_DIR}/coverage)

set(URLPARSER_COVERAGE_TOTAL_BINARY_DIR ${URLPARSER_COVERAGE_BINARY_DIR}/total CACHE PATH "Total coverage output directory")
set(URLPARSER_COVERAGE_CPP_BINARY_DIR ${URLPARSER_COVERAGE_BINARY_DIR}/cpp CACHE PATH "C++ coverage output directory")
set(URLPARSER_COVERAGE_PYTHON_BINARY_DIR ${URLPARSER_COVERAGE_BINARY_DIR}/python CACHE PATH "Python coverage output directory")

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

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

add_custom_target(urlparser_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(${URLPARSER_TEST_SOURCE_DIR}/cpp)
add_subdirectory(${URLPARSER_TEST_SOURCE_DIR}/python)

if(TARGET urlparser_coverage_cpp AND TARGET urlparser_coverage_python)
    if(LCOV_EXECUTABLE AND GENHTML_EXECUTABLE)
        add_custom_target(urlparser_coverage_total
            # Clean previous coverage data
            COMMAND ${CMAKE_COMMAND} -E remove_directory ${URLPARSER_COVERAGE_TOTAL_BINARY_DIR}
            COMMAND ${CMAKE_COMMAND} -E make_directory ${URLPARSER_COVERAGE_TOTAL_BINARY_DIR}/html

            # Merge all coverage info files
            COMMAND ${CMAKE_COMMAND} -E echo "-- Merging C++ and Python coverage..."
            COMMAND ${LCOV_EXECUTABLE}
                    --add-tracefile ${URLPARSER_COVERAGE_CPP_BINARY_DIR}/coverage.lcov
                    --add-tracefile ${URLPARSER_COVERAGE_PYTHON_BINARY_DIR}/coverage.lcov
                    --output-file ${URLPARSER_COVERAGE_TOTAL_BINARY_DIR}/coverage.lcov
            COMMAND ${CMAKE_COMMAND} -E echo "-- Total coverage info created at: ${URLPARSER_COVERAGE_TOTAL_BINARY_DIR}/coverage.lcov"

            # Generate HTML report
            COMMAND ${CMAKE_COMMAND} -E echo "-- Generating HTML report..."
            COMMAND ${GENHTML_EXECUTABLE} --quiet
                    ${URLPARSER_COVERAGE_TOTAL_BINARY_DIR}/coverage.lcov
                    --output-directory ${URLPARSER_COVERAGE_TOTAL_BINARY_DIR}/html
                    --prefix ${PROJECT_SOURCE_DIR}
                    --title "liburlparser Total Coverage"
                    --css-file ${URLPARSER_TEST_SOURCE_DIR}/genhtml.css
                    --dark-mode
            COMMAND ${CMAKE_COMMAND}
                -DCOV_FILE=${URLPARSER_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: ${URLPARSER_COVERAGE_TOTAL_BINARY_DIR}/html/index.html"

            # Wrap the raw genhtml report in a themed iframe page at total/index.html
            COMMAND ${CMAKE_COMMAND}
                    -DIFRAME_SRC=html/index.html
                    -DSECTION_TITLE=Total%20Coverage
                    -DLOGO_SVG=${PROJECT_SOURCE_DIR}/docs/images/logo/liburlparser-logo-1.svg
                    -DPROJECT_NAME=liburlparser
                    -DOUTPUT_DIR=${URLPARSER_COVERAGE_TOTAL_BINARY_DIR}
                    -P ${PROJECT_SOURCE_DIR}/cmake/GenerateIframe.cmake

            WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
            USES_TERMINAL
        )

        add_dependencies(urlparser_coverage_total urlparser_coverage_cpp urlparser_coverage_python)
        add_dependencies(urlparser_coverage urlparser_coverage_total)
    endif()
endif()

# ── Generate Coverage Dashboard HTML (root router page) ─────────
# Same dashboard ctoon uses, trimmed to the two bindings liburlparser
# actually has (no C/Go/MATLAB cards).
set(COVERAGE_DATA_JSON "[")

if(TARGET urlparser_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 the C++ core and Python bindings. Useful for SonarQube analysis.\",
            \"htmlLink\": \"total/index.html\",
            \"lcovLink\": \"total/coverage.lcov\"
        },")
endif()

if(TARGET urlparser_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/index.html\",
            \"lcovLink\": \"cpp/coverage.lcov\"
        },")
endif()

if(TARGET urlparser_coverage_python)
    set(COVERAGE_DATA_JSON "${COVERAGE_DATA_JSON}
        {
            \"id\": \"py\",
            \"title\": \"Python Bindings\",
            \"badge\": \"Interpreter\",
            \"color\": \"#3572A5\",
            \"desc\": \"Coverage analysis for the nanobind extension's Python-side logic, generated by coverage.py.\",
            \"htmlLink\": \"python/index.html\",
            \"lcovLink\": \"python/coverage.lcov\"
        },")
endif()

set(COVERAGE_DATA_JSON "${COVERAGE_DATA_JSON}]")

set(URLPARSER_LOGO_SVG "${PROJECT_SOURCE_DIR}/docs/images/logo/liburlparser-logo-1.svg")
if(EXISTS "${URLPARSER_LOGO_SVG}")
    file(READ "${URLPARSER_LOGO_SVG}" LOGO_CONTENT)
else()
    set(LOGO_CONTENT "")
endif()

set(PROJECT_NAME "liburlparser")

configure_file(
    ${URLPARSER_TEST_SOURCE_DIR}/coverage_dashboard.html.in
    ${URLPARSER_COVERAGE_BINARY_DIR}/index.html
    @ONLY
)
