# Allow building just qtwaylandscanner_kde when cross-compiling since the
# dependencies for the rest of the targets might not be installed on the host.
if (${CMAKE_CURRENT_SOURCE_DIR} STREQUAL ${CMAKE_SOURCE_DIR})
    cmake_minimum_required(VERSION 3.16)
    project(qtwaylandscanner_kde CXX)
    set(CMAKE_CXX_STANDARD 20)
    find_package(Qt6 5.15.0 CONFIG REQUIRED Core)
    find_package(ECM ${KF6_MIN_VERSION} NO_MODULE REQUIRED)
    set(CMAKE_MODULE_PATH ${ECM_MODULE_PATH})
endif()

# when cross compiling, use either the executable offered or try to cross-compile it in place.
if(CMAKE_CROSSCOMPILING AND QTWAYLANDSCANNER_KDE_EXECUTABLE)
    add_executable(qtwaylandscanner_kde IMPORTED GLOBAL)
    set_target_properties(qtwaylandscanner_kde PROPERTIES IMPORTED_LOCATION ${QTWAYLANDSCANNER_KDE_EXECUTABLE})
elseif(CMAKE_CROSSCOMPILING)
    if (NOT KF6_HOST_TOOLING)
        message(FATAL_ERROR "Please provide a prefix with a native Qt build and pass -DKF6_HOST_TOOLING=path")
    endif()

    # search native tooling prefix
    set(NATIVE_PREFIX "" CACHE STRING "CMAKE_PREFIX_PATH for native Qt libraries")
    if (NOT NATIVE_PREFIX)
        string(FIND ${KF6_HOST_TOOLING} /lib idx)
        string(SUBSTRING ${KF6_HOST_TOOLING} 0 ${idx} NATIVE_PREFIX)
    endif()
    message(STATUS "Building qtwaylandscanner_kde against ${NATIVE_PREFIX}")

    include(ExternalProject)
    ExternalProject_Add(native_qtwaylandscanner_kde
            SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}
            CMAKE_ARGS -DECM_DIR=${ECM_DIR} -DCMAKE_PREFIX_PATH=${NATIVE_PREFIX}
            -DCMAKE_INSTALL_PREFIX=${CMAKE_CURRENT_BINARY_DIR}
            -DQT_MAJOR_VERSION=${QT_MAJOR_VERSION}
            INSTALL_COMMAND ""
            BUILD_BYPRODUCTS ${CMAKE_CURRENT_BINARY_DIR}/native_qtwaylandscanner_kde-prefix/src/native_qtwaylandscanner_kde-build/qtwaylandscanner_kde
            )
    add_executable(qtwaylandscanner_kde IMPORTED GLOBAL)
    add_dependencies(qtwaylandscanner_kde native_qtwaylandscanner_kde)
    set_target_properties(qtwaylandscanner_kde PROPERTIES IMPORTED_LOCATION
            ${CMAKE_CURRENT_BINARY_DIR}/native_qtwaylandscanner_kde-prefix/src/native_qtwaylandscanner_kde-build/qtwaylandscanner_kde)
else()
    # host build
    remove_definitions(-DQT_NO_CAST_FROM_ASCII)
    add_executable(qtwaylandscanner_kde qtwaylandscanner.cpp)
    target_link_libraries(qtwaylandscanner_kde Qt::Core)
    include(ECMMarkNonGuiExecutable)
    ecm_mark_nongui_executable(qtwaylandscanner_kde)
endif()

function(ecm_add_qtwayland_server_protocol_kde target)
    # Parse arguments
    set(options PRIVATE_CODE)
    set(oneValueArgs)
    set(multiValueArgs FILES)
    cmake_parse_arguments(ARGS "${options}" "${oneValueArgs}" "${multiValueArgs}" ${ARGN})

    if(ARGS_UNPARSED_ARGUMENTS)
        message(FATAL_ERROR "Unknown keywords given to ecm_add_qtwayland_server_protocol_kde(): \"${ARGS_UNPARSED_ARGUMENTS}\"")
    endif()

    if(ARGS_PRIVATE_CODE)
        set(_private_code_option PRIVATE_CODE)
    endif()

    find_package(WaylandScanner REQUIRED QUIET)

    foreach(_protocol IN LISTS ARGS_FILES)
        get_filename_component(_basename "${_protocol}" NAME_WLE)
        get_filename_component(_infile ${_protocol} ABSOLUTE)

        ecm_add_wayland_server_protocol(${target}
                                        PROTOCOL ${_protocol}
                                        BASENAME ${_basename}
                                        ${_private_code_option})

        set(_header "${CMAKE_CURRENT_BINARY_DIR}/qwayland-server-${_basename}.h")
        set(_code "${CMAKE_CURRENT_BINARY_DIR}/qwayland-server-${_basename}.cpp")

        set_source_files_properties(${_header} ${_code} GENERATED)

        add_custom_command(OUTPUT "${_header}"
            COMMAND qtwaylandscanner_kde server-header ${_infile} --basename=${_basename} > ${_header}
            DEPENDS ${_infile} qtwaylandscanner_kde VERBATIM)

        add_custom_command(OUTPUT "${_code}"
            COMMAND qtwaylandscanner_kde server-code ${_infile} --basename=${_basename} > ${_code}
            DEPENDS ${_infile} ${_header} qtwaylandscanner_kde VERBATIM)

        set_property(SOURCE ${_header} ${_code} PROPERTY SKIP_AUTOMOC ON)

        target_sources(${target} PRIVATE "${_code}")
    endforeach()
endfunction()
