# Copyright 2020 The Dawn & Tint Authors
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice, this
#    list of conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright notice,
#    this list of conditions and the following disclaimer in the documentation
#    and/or other materials provided with the distribution.
#
# 3. Neither the name of the copyright holder nor the names of its
#    contributors may be used to endorse or promote products derived from
#    this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
# OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

# Check for Jinja2
if (NOT DAWN_JINJA2_DIR)
    message(STATUS "Dawn: Using system jinja2")
    execute_process(
        COMMAND ${Python3_EXECUTABLE} -c "import jinja2"
        RESULT_VARIABLE RET
    )
    if (NOT RET EQUAL 0)
        message(FATAL_ERROR "Dawn: Missing dependencies for code generation, please ensure you have python-jinja2 installed.")
    endif()
else()
    message(STATUS "Dawn: using jinja2 at ${DAWN_JINJA2_DIR}")
    message(STATUS "Dawn: using markupsafe at ${DAWN_MARKUPSAFE_DIR}")
endif()

# Function to invoke a generator_lib.py generator.
#  - SCRIPT is the name of the script to call
#  - OUTPUT_HEADERS will be modified to contain the list of header files (*.h, *.hpp) generated by this generator
#  - OUTPUT_SOURCES will be modified to contain the list of all other files generated by this generator
#  - ARGS are the extra arguments to pass to the script in addition to the base generator_lib.py arguments
#  - PRINT_NAME is the name to use when outputting status or errors
function(DawnGenerator)
    cmake_parse_arguments(PARSE_ARGV 0 arg
        ""
        "SCRIPT;OUTPUT_HEADERS;OUTPUT_SOURCES;PRINT_NAME"
        "EXTRA_PARAMETERS"
    )

    if (arg_UNPARSED_ARGUMENTS)
      message(FATAL_ERROR
        "Unparsed arguments for DawnGenerator: "
        "${arg_UNPARSED_ARGUMENTS}")
    endif ()

    # Build the set of args common to all invocation of that generator.
    set(BASE_ARGS
        ${Python3_EXECUTABLE}
        ${arg_SCRIPT}
        --template-dir
        "${DAWN_TEMPLATE_DIR}"
        --root-dir
        "${Dawn_SOURCE_DIR}"
        --output-dir
        "${DAWN_BUILD_GEN_DIR}"
        ${arg_EXTRA_PARAMETERS}
    )
    if (DAWN_JINJA2_DIR)
        list(APPEND BASE_ARGS --jinja2-path ${DAWN_JINJA2_DIR})
    endif()
    if (DAWN_MARKUPSAFE_DIR)
        list(APPEND BASE_ARGS --markupsafe-path ${DAWN_MARKUPSAFE_DIR})
    endif()

    # Call the generator to get the list of its dependencies.
    execute_process(
        COMMAND ${BASE_ARGS} --print-cmake-dependencies
        OUTPUT_VARIABLE DEPENDENCIES
        RESULT_VARIABLE RET
    )
    if (NOT RET EQUAL 0)
        message(FATAL_ERROR "Dawn: Failed to get the dependencies for ${arg_PRINT_NAME}. Base args are '${BASE_ARGS}'.")
    endif()

    # Ask CMake to re-run if any of the dependencies changed as it might modify the build graph.
    set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS ${DEPENDENCIES})

    # Call the generator to get the list of its outputs.
    execute_process(
        COMMAND ${BASE_ARGS} --print-cmake-outputs
        OUTPUT_VARIABLE OUTPUTS
        RESULT_VARIABLE RET
    )
    if (NOT RET EQUAL 0)
        message(FATAL_ERROR "Dawn: Failed to get the outputs for ${arg_PRINT_NAME}. Base args are '${BASE_ARGS}'.")
    endif()

    # Add the custom command that calls the generator.
    add_custom_command(
        COMMAND ${BASE_ARGS}
        DEPENDS ${DEPENDENCIES}
        OUTPUT ${OUTPUTS}
        COMMENT "Dawn: Generating files for ${arg_PRINT_NAME}."
    )

    # Populate the list of outputs.
    set(headers)
    set(sources)
    foreach (filename IN LISTS OUTPUTS)
        get_filename_component(extension "${filename}" EXT)
        if (extension MATCHES "(h|hpp)")
            list(APPEND headers "${filename}")
        else ()
            list(APPEND sources "${filename}")
        endif ()
    endforeach ()

    if (sources AND NOT arg_OUTPUT_SOURCES)
        message(FATAL_ERROR
            "This function generated source files, although an output variable was not defined!"
            "Please provide a variable name for OUTPUT_SOURCES.")
    endif ()

    if (headers AND NOT arg_OUTPUT_HEADERS)
        message(FATAL_ERROR
            "This function generated header files, although an output variable was not defined!"
            "Please provide a variable name for OUTPUT_HEADERS.")
    endif ()

    set(${arg_OUTPUT_SOURCES} ${sources} PARENT_SCOPE)
    set(${arg_OUTPUT_HEADERS} ${headers} PARENT_SCOPE)

    # Prior to CMake 3.20 the GENERATED property is local to a directory which means that putting
    # generated headers in INTERFACE properties causes dependent targets to complain that they
    # cannot find the file. (because they don't see it as generated and want to check is is
    # actually on the filesystem).
    # Work around this by generating the files once if they aren't present at configuration time.
    set(needToGenerate OFF)
    foreach(path ${OUTPUTS})
        if (NOT EXISTS ${path})
            set(needToGenerate ON)
        endif()
    endforeach()

    if (${needToGenerate})
        message(STATUS "Dawn: Generating initial versions of files for ${arg_PRINT_NAME}.")
        execute_process(COMMAND ${BASE_ARGS} RESULT_VARIABLE RET)
        if (NOT RET EQUAL 0)
            message(FATAL_ERROR "Dawn: Failed to generate the initial version of files for ${arg_PRINT_NAME}. Base args are '${BASE_ARGS}'.")
        endif()
    endif()
endfunction()

# Helper function to call dawn_generator.py:
#  - TARGET is the generator target to build
#  - OUTPUT_HEADERS, OUTPUT_SOURCES, and PRINT_NAME are like for DawnGenerator
function(DawnJSONGenerator)
    cmake_parse_arguments(PARSE_ARGV 0 arg
        ""
        "TARGET;OUTPUT_SOURCES;OUTPUT_HEADERS;PRINT_NAME"
        ""
    )
    DawnGenerator(
        SCRIPT "${Dawn_SOURCE_DIR}/generator/dawn_json_generator.py"
        PRINT_NAME "${arg_PRINT_NAME}"
        OUTPUT_HEADERS HEADERS
        OUTPUT_SOURCES SOURCES
        EXTRA_PARAMETERS
             --dawn-json
             "${Dawn_SOURCE_DIR}/src/dawn/dawn.json"
             --wire-json
             "${Dawn_SOURCE_DIR}/src/dawn/dawn_wire.json"
             --kotlin-json
             "${Dawn_SOURCE_DIR}/src/dawn/dawn_kotlin.json"
             --targets
             ${arg_TARGET}
             ${arg_UNPARSED_ARGUMENTS}
    )

    if (SOURCES AND NOT arg_OUTPUT_SOURCES)
        message(FATAL_ERROR
            "This function generated source files, although an output variable was not defined!"
            "Please provide a variable name for OUTPUT_SOURCES.")
    elseif (arg_OUTPUT_SOURCES AND NOT SOURCES)
        message(WARNING
            "This function did not generate source files. The OUTPUT_SOURCES argument is unnecessary.")
    endif ()

    if (HEADERS AND NOT arg_OUTPUT_HEADERS)
        message(FATAL_ERROR
            "This function generated header files, although an output variable was not defined!"
            "Please provide a variable name for OUTPUT_HEADERS.")
    elseif (arg_OUTPUT_HEADERS AND NOT HEADERS)
        message(WARNING
            "This function did not generate header files. The OUTPUT_HEADERS argument is unnecessary.")
    endif ()

    # Forward the result up one more scope
    set(${arg_OUTPUT_SOURCES} ${SOURCES} PARENT_SCOPE)
    set(${arg_OUTPUT_HEADERS} ${HEADERS} PARENT_SCOPE)
endfunction()
