# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#
# =============================================================================
# GenerateThriftSources.cmake
#
# Generates C++ stubs from the iotdb-protocol Thrift files using the thrift
# compiler that FetchThrift just built.
#
# Inputs (resolved relative to the workspace root):
#   iotdb-protocol/thrift-commons/src/main/thrift/common.thrift
#   iotdb-protocol/thrift-datanode/src/main/thrift/client.thrift
#
# Outputs:
#   ${THRIFT_GEN_CPP_DIR}/*.{h,cpp}     - generated C++ sources
#   THRIFT_GENERATED_SRCS               - list of *.cpp files for linking
#   THRIFT_GENERATED_HDRS               - list of *.h files (informational)
# =============================================================================

if(NOT THRIFT_EXECUTABLE)
    message(FATAL_ERROR "[GenThrift] THRIFT_EXECUTABLE not set - did FetchThrift run first?")
endif()

# Anchor the source-of-truth .thrift files via the workspace root. The CMake
# project lives at <repo>/iotdb-client/client-cpp/, so the workspace root is
# two levels up.
get_filename_component(_workspace_root "${CMAKE_CURRENT_SOURCE_DIR}/../.." ABSOLUTE)

set(_common_thrift "${_workspace_root}/iotdb-protocol/thrift-commons/src/main/thrift/common.thrift")
set(_client_thrift "${_workspace_root}/iotdb-protocol/thrift-datanode/src/main/thrift/client.thrift")

foreach(_f IN ITEMS "${_common_thrift}" "${_client_thrift}")
    if(NOT EXISTS "${_f}")
        message(FATAL_ERROR "[GenThrift] missing thrift input: ${_f}")
    endif()
endforeach()

# Mirror the bash reference script: stage both .thrift files into a flat
# working directory so `include "common.thrift"` resolves without -I args.
set(_thrift_proto_dir "${CMAKE_BINARY_DIR}/thrift-protocols")
file(MAKE_DIRECTORY "${_thrift_proto_dir}")
configure_file("${_common_thrift}" "${_thrift_proto_dir}/common.thrift" COPYONLY)
configure_file("${_client_thrift}" "${_thrift_proto_dir}/client.thrift" COPYONLY)

set(THRIFT_GEN_CPP_DIR "${CMAKE_BINARY_DIR}/gen-cpp" CACHE PATH "" FORCE)
file(MAKE_DIRECTORY "${THRIFT_GEN_CPP_DIR}")

# A stamp file lets us re-run thrift only when one of the inputs changes
# (handled by add_custom_command at build time) while also making sure we
# run once at configure time so the initial file(GLOB) finds something.
set(_thrift_stamp "${THRIFT_GEN_CPP_DIR}/.generated-stamp")

set(_thrift_inputs
        "${_thrift_proto_dir}/common.thrift"
        "${_thrift_proto_dir}/client.thrift")

set(_run_thrift FALSE)
if(NOT EXISTS "${_thrift_stamp}")
    set(_run_thrift TRUE)
else()
    foreach(_in IN LISTS _thrift_inputs)
        if("${_in}" IS_NEWER_THAN "${_thrift_stamp}")
            set(_run_thrift TRUE)
            break()
        endif()
    endforeach()
endif()

if(_run_thrift)
    message(STATUS "[GenThrift] running ${THRIFT_EXECUTABLE} on common.thrift / client.thrift")
    foreach(_in IN LISTS _thrift_inputs)
        execute_process(
                COMMAND "${THRIFT_EXECUTABLE}" -r --gen cpp:no_skeleton -out "${THRIFT_GEN_CPP_DIR}" "${_in}"
                WORKING_DIRECTORY "${_thrift_proto_dir}"
                RESULT_VARIABLE _rc)
        if(NOT _rc EQUAL 0)
            message(FATAL_ERROR "[GenThrift] thrift compile failed for ${_in} (rc=${_rc})")
        endif()
    endforeach()
    # Defensive: remove any accidentally produced server skeleton.
    file(GLOB _skeletons "${THRIFT_GEN_CPP_DIR}/*_server.skeleton.cpp")
    if(_skeletons)
        file(REMOVE ${_skeletons})
    endif()
    file(TOUCH "${_thrift_stamp}")
endif()

# Build-time regeneration: whenever the workspace .thrift files change, rerun
# the thrift compiler. The OUTPUT is the stamp; downstream targets that
# depend on iotdb_thrift_codegen will get the rebuild for free.
add_custom_command(
        OUTPUT "${_thrift_stamp}"
        COMMAND ${CMAKE_COMMAND} -E copy_if_different "${_common_thrift}" "${_thrift_proto_dir}/common.thrift"
        COMMAND ${CMAKE_COMMAND} -E copy_if_different "${_client_thrift}" "${_thrift_proto_dir}/client.thrift"
        COMMAND "${THRIFT_EXECUTABLE}" -r --gen cpp:no_skeleton -out "${THRIFT_GEN_CPP_DIR}" "${_thrift_proto_dir}/common.thrift"
        COMMAND "${THRIFT_EXECUTABLE}" -r --gen cpp:no_skeleton -out "${THRIFT_GEN_CPP_DIR}" "${_thrift_proto_dir}/client.thrift"
        COMMAND ${CMAKE_COMMAND} -E touch "${_thrift_stamp}"
        DEPENDS "${_common_thrift}" "${_client_thrift}" iotdb_thrift_external
        WORKING_DIRECTORY "${_thrift_proto_dir}"
        COMMENT "Regenerating thrift C++ stubs"
        VERBATIM)

add_custom_target(iotdb_thrift_codegen DEPENDS "${_thrift_stamp}")

# Glob results with CONFIGURE_DEPENDS so re-cmake picks up newly produced files.
file(GLOB THRIFT_GENERATED_SRCS CONFIGURE_DEPENDS "${THRIFT_GEN_CPP_DIR}/*.cpp")
file(GLOB THRIFT_GENERATED_HDRS CONFIGURE_DEPENDS "${THRIFT_GEN_CPP_DIR}/*.h")

list(FILTER THRIFT_GENERATED_SRCS EXCLUDE REGEX ".*_server\\.skeleton\\.cpp$")

message(STATUS "[GenThrift] generated ${THRIFT_GEN_CPP_DIR} with "
        "$<LIST_LENGTH:THRIFT_GENERATED_SRCS> cpp files")
