include(CMakeParseArguments)

function(QTQUICK_COMPILER_DETERMINE_OUTPUT_FILENAME outvariable filename)
    file(RELATIVE_PATH relpath ${CMAKE_CURRENT_SOURCE_DIR} ${filename})
    string(REPLACE \".qml\" \"_qml\" relpath ${relpath})
    string(REPLACE \".js\" \"_js\" relpath ${relpath})
    string(REPLACE \".mjs\" \"_mjs\" relpath ${relpath})
    string(REPLACE \"/\" \"_\" relpath ${relpath})
    set(${outvariable} ${CMAKE_CURRENT_BINARY_DIR}/${relpath}.cpp PARENT_SCOPE)
endfunction()

function(QTQUICK_COMPILER_ADD_RESOURCES outfiles)
    set(options)
    set(oneValueArgs)
    set(multiValueArgs OPTIONS)

    cmake_parse_arguments(_RCC \"${options}\" \"${oneValueArgs}\" \"${multiValueArgs}\" ${ARGN})

    find_package(Qt5 COMPONENTS Qml Core)

!!IF isEmpty(CMAKE_BIN_DIR_IS_ABSOLUTE)
    set(compiler_path \"${_qt5Core_install_prefix}/$${CMAKE_BIN_DIR}qmlcachegen$$CMAKE_BIN_SUFFIX\")
!!ELSE
    set(compiler_path \"$${CMAKE_BIN_DIR}qmlcachegen$$CMAKE_BIN_SUFFIX\")
!!ENDIF
    if(NOT EXISTS \"${compiler_path}\" )
        message(FATAL_ERROR \"The package \\\"Qt5QuickCompilerConfig\\\" references the file
   \\\"${compiler_path}\\\"
but this file does not exist.  Possible reasons include:
* The file was deleted, renamed, or moved to another location.
* An install or uninstall procedure did not complete successfully.
* The installation package was faulty and contained
   \\\"${CMAKE_CURRENT_LIST_FILE}\\\"
but not all the files it references.
\")
    endif()

    get_target_property(rcc_path ${Qt5Core_RCC_EXECUTABLE} IMPORTED_LOCATION)

    set(rcc_files ${_RCC_UNPARSED_ARGUMENTS})
    set(rcc_options ${_RCC_OPTIONS})
    set(filtered_rcc_files)
    set(compiler_output)
    set(rcc_files_with_compilation_units)
    set(loader_flags)

    foreach(_resource ${rcc_files})
        get_filename_component(resource_base ${_resource} NAME_WE)
        set(new_resource_file ${CMAKE_CURRENT_BINARY_DIR}/${resource_base}_qmlcache.qrc)

        get_filename_component(input_resource ${_resource} ABSOLUTE)
        set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS "${input_resource}")

        execute_process(COMMAND ${compiler_path} --filter-resource-file ${input_resource} -o ${new_resource_file} OUTPUT_VARIABLE remaining_files)
        list(APPEND filtered_rcc_files ${new_resource_file})
        list(APPEND loader_flags \"--resource-file-mapping=${_resource}=${new_resource_file}\")

        set(rcc_file_with_compilation_units)

        execute_process(COMMAND ${rcc_path} -list \"${input_resource}\" OUTPUT_VARIABLE rcc_contents)
        if (NOT rcc_contents STREQUAL \"\")
            string(REGEX REPLACE \"[\r\n]+\" \";\" rcc_contents ${rcc_contents})
            foreach(it ${rcc_contents})
                get_filename_component(extension ${it} EXT)
                if(extension STREQUAL \".qml\" OR extension STREQUAL \".js\" OR extension STREQUAL \".ui.qml\" OR extension STREQUAL \".mjs\")
                    qtquick_compiler_determine_output_filename(output_file ${it})
                    add_custom_command(OUTPUT ${output_file}
                                       COMMAND ${compiler_path}
                                       ARGS --resource=${input_resource} ${it} -o ${output_file}
                                       DEPENDS ${it} ${input_resource})
                    list(APPEND compiler_output ${output_file})
                    set(rcc_file_with_compilation_units ${input_resource})
                endif()
            endforeach()
        endif()

        if(rcc_file_with_compilation_units)
            list(APPEND rcc_files_with_compilation_units ${rcc_file_with_compilation_units})
        endif()
    endforeach()

    if(rcc_files_with_compilation_units)
        set(loader_source ${CMAKE_CURRENT_BINARY_DIR}/qmlcache_loader.cpp)
        add_custom_command(OUTPUT ${loader_source} COMMAND ${compiler_path} ARGS ${loader_flags} ${rcc_files_with_compilation_units} -o ${loader_source} DEPENDS ${rcc_files_with_compilation_units})
        list(APPEND compiler_output ${loader_source})
    endif()

    qt5_add_resources(output_resources ${filtered_rcc_files} OPTIONS ${options})
    set(${outfiles} ${output_resources} ${compiler_output} PARENT_SCOPE)
endfunction()
