add_library(script_api
        INTERFACE
)

# Get script_window.hpp dependencies
file(STRINGS ${CMAKE_CURRENT_SOURCE_DIR}/script_window.hpp.in ENUM_LINES REGEX "@enum")
foreach(ENUM IN LISTS ENUM_LINES)
    string(REGEX REPLACE ".* ([^ @]+)@.*" "\\1" FILE_PATTERN "${ENUM}")
    file(GLOB FILENAMES "${FILE_PATTERN}")
    list(APPEND DEPENDENCIES ${FILENAMES})
endforeach()
list(REMOVE_DUPLICATES DEPENDENCIES)

# Add a command to generate script_window.hpp
add_custom_command_timestamp(OUTPUT ${CMAKE_BINARY_DIR}/generated/script/api/script_window.hpp
        COMMAND ${CMAKE_COMMAND}
                -DGENERATE_SOURCE_FILE=${CMAKE_CURRENT_SOURCE_DIR}/script_window.hpp.in
                -DGENERATE_BINARY_FILE=${CMAKE_BINARY_DIR}/generated/script/api/script_window.hpp
                -P ${CMAKE_SOURCE_DIR}/cmake/scripts/GenerateWidget.cmake
        MAIN_DEPENDENCY ${CMAKE_CURRENT_SOURCE_DIR}/script_window.hpp.in
        DEPENDS ${CMAKE_SOURCE_DIR}/cmake/scripts/GenerateWidget.cmake ${DEPENDENCIES}
        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
        COMMENT "Generating script_window.hpp"
)
add_custom_target_timestamp(script_window
        DEPENDS
        ${CMAKE_BINARY_DIR}/generated/script/api/script_window.hpp
)
target_include_directories(script_api
        INTERFACE
        ${CMAKE_BINARY_DIR}/generated/script/api/
        ${CMAKE_CURRENT_SOURCE_DIR}
)

file(GLOB SCRIPT_API_FILES "script_*.hpp")
list(APPEND SCRIPT_API_FILES ${CMAKE_BINARY_DIR}/generated/script/api/script_window.hpp)

foreach(API "ai;AI" "game;GS" "template;Template")
    list(GET API 0 APILC)
    list(GET API 1 APIUC)

    foreach(SCRIPT_API_FILE IN LISTS SCRIPT_API_FILES)
        if("${SCRIPT_API_FILE}" MATCHES ".*script_controller.*")
            continue()
        endif()
        get_filename_component(SCRIPT_API_FILE_NAME "${SCRIPT_API_FILE}" NAME)
        string(REPLACE "script_" "${APILC}_" SCRIPT_API_FILE_NAME "${SCRIPT_API_FILE_NAME}")
        set(SCRIPT_API_BINARY_FILE "${CMAKE_BINARY_DIR}/generated/script/api/${APILC}/${SCRIPT_API_FILE_NAME}.sq")

        add_custom_command_timestamp(OUTPUT ${SCRIPT_API_BINARY_FILE}
                COMMAND ${CMAKE_COMMAND}
                        -DSCRIPT_API_SOURCE_FILE=${CMAKE_CURRENT_SOURCE_DIR}/squirrel_export.hpp.sq.in
                        -DSCRIPT_API_BINARY_FILE=${SCRIPT_API_BINARY_FILE}
                        -DSCRIPT_API_FILE=${SCRIPT_API_FILE}
                        -DAPIUC=${APIUC}
                        -DAPILC=${APILC}
                        -P ${CMAKE_SOURCE_DIR}/cmake/scripts/SquirrelExport.cmake
                MAIN_DEPENDENCY ${SCRIPT_API_FILE}
                DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/squirrel_export.hpp.sq.in
                        ${CMAKE_SOURCE_DIR}/cmake/scripts/SquirrelExport.cmake
                WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
                COMMENT "Generating ${APILC}/${SCRIPT_API_FILE_NAME}.sq"
        )
        list(APPEND SCRIPT_${APIUC}_BINARY_FILES ${SCRIPT_API_BINARY_FILE})
    endforeach()

    add_custom_target_timestamp(script_${APILC}
            DEPENDS
            ${SCRIPT_${APIUC}_BINARY_FILES}
    )
    add_dependencies(script_${APILC}
            script_window
    )

    if(NOT "${APILC}" STREQUAL "template")
        list(APPEND SCRIPT_${APIUC}_BINARY_FILES "${CMAKE_CURRENT_SOURCE_DIR}/${APILC}/${APILC}_controller.hpp.sq")
        set(INCLUDES_BINARY_FILE "${CMAKE_BINARY_DIR}/generated/script/api/${APILC}/${APILC}_includes.hpp")
        set(API_FILES "${CMAKE_CURRENT_BINARY_DIR}/${APILC}.files")
        file(GENERATE OUTPUT ${API_FILES} CONTENT "${SCRIPT_${APIUC}_BINARY_FILES}")
        add_custom_command_timestamp(OUTPUT ${INCLUDES_BINARY_FILE}
                COMMAND ${CMAKE_COMMAND}
                        -DINCLUDES_SOURCE_FILE=${CMAKE_CURRENT_SOURCE_DIR}/script_includes.hpp.in
                        -DINCLUDES_BINARY_FILE=${INCLUDES_BINARY_FILE}
                        -DAPIUC=${APIUC}
                        -DAPILC=${APILC}
                        -DAPI_FILES=${API_FILES}
                        -P ${CMAKE_SOURCE_DIR}/cmake/scripts/SquirrelIncludes.cmake
                MAIN_DEPENDENCY ${CMAKE_CURRENT_SOURCE_DIR}/script_includes.hpp.in
                DEPENDS ${SCRIPT_${APIUC}_BINARY_FILES}
                        ${API_FILES}
                        ${CMAKE_SOURCE_DIR}/cmake/scripts/SquirrelIncludes.cmake
                WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
                COMMENT "Generating ${APILC}/${APILC}_includes.hpp"
        )
        add_custom_target_timestamp(script_${APILC}_includes
                DEPENDS
                ${INCLUDES_BINARY_FILE}
        )
        add_dependencies(script_${APILC}_includes
            script_${APILC}
        )
        add_dependencies(script_api
                script_${APILC}_includes
        )

        # Documentation
        if(DOXYGEN_EXECUTABLE)
            add_custom_target(docs_${APILC}
                ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/docs
                COMMAND ${DOXYGEN_EXECUTABLE} ${CMAKE_BINARY_DIR}/Doxyfile_${APIUC}
                WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
                COMMENT "Generating documentation for ${APILC} API"
            )
            add_dependencies(docs_${APILC}
                find_version
                script_window
            )
            add_dependencies(docs
                docs_${APILC}
            )
        endif()
    else()
        add_dependencies(script_api
                script_${APILC}
        )
    endif()

    target_include_directories(script_api
            INTERFACE
            ${CMAKE_BINARY_DIR}/generated/script
            ${CMAKE_BINARY_DIR}/generated/script/api/${APILC}
            ${CMAKE_CURRENT_SOURCE_DIR}/${APILC}
    )
endforeach()

if(OPTION_TOOLS_ONLY)
    return()
endif()

add_library(openttd::script_api ALIAS script_api)


add_files(
    ai_changelog.hpp
    game_changelog.hpp
    script_accounting.hpp
    script_admin.hpp
    script_airport.hpp
    script_asyncmode.hpp
    script_base.hpp
    script_basestation.hpp
    script_bridge.hpp
    script_bridgelist.hpp
    script_timemode.hpp
    script_cargo.hpp
    script_cargolist.hpp
    script_cargomonitor.hpp
    script_client.hpp
    script_clientlist.hpp
    script_company.hpp
    script_companymode.hpp
    script_controller.hpp
    script_date.hpp
    script_depotlist.hpp
    script_engine.hpp
    script_enginelist.hpp
    script_error.hpp
    script_event.hpp
    script_event_types.hpp
    script_execmode.hpp
    script_game.hpp
    script_gamesettings.hpp
    script_goal.hpp
    script_group.hpp
    script_grouplist.hpp
    script_industry.hpp
    script_industrylist.hpp
    script_industrytype.hpp
    script_industrytypelist.hpp
    script_info_docs.hpp
    script_infrastructure.hpp
    script_league.hpp
    script_list.hpp
    script_log.hpp
    script_log_types.hpp
    script_map.hpp
    script_marine.hpp
    script_newgrf.hpp
    script_news.hpp
    script_object.hpp
    script_objecttype.hpp
    script_objecttypelist.hpp
    script_order.hpp
    script_priorityqueue.hpp
    script_rail.hpp
    script_railtypelist.hpp
    script_road.hpp
    script_roadtypelist.hpp
    script_sign.hpp
    script_signlist.hpp
    script_station.hpp
    script_stationlist.hpp
    script_story_page.hpp
    script_storypagelist.hpp
    script_storypageelementlist.hpp
    script_subsidy.hpp
    script_subsidylist.hpp
    script_testmode.hpp
    script_text.hpp
    script_tile.hpp
    script_tilelist.hpp
    script_town.hpp
    script_townlist.hpp
    script_tunnel.hpp
    script_types.hpp
    script_vehicle.hpp
    script_vehiclelist.hpp
    script_viewport.hpp
    script_waypoint.hpp
    script_waypointlist.hpp
    script_accounting.cpp
    script_admin.cpp
    script_airport.cpp
    script_asyncmode.cpp
    script_base.cpp
    script_basestation.cpp
    script_bridge.cpp
    script_bridgelist.cpp
    script_timemode.cpp
    script_cargo.cpp
    script_cargolist.cpp
    script_cargomonitor.cpp
    script_client.cpp
    script_clientlist.cpp
    script_company.cpp
    script_companymode.cpp
    script_controller.cpp
    script_date.cpp
    script_depotlist.cpp
    script_engine.cpp
    script_enginelist.cpp
    script_error.cpp
    script_event.cpp
    script_event_types.cpp
    script_execmode.cpp
    script_game.cpp
    script_gamesettings.cpp
    script_goal.cpp
    script_group.cpp
    script_grouplist.cpp
    script_industry.cpp
    script_industrylist.cpp
    script_industrytype.cpp
    script_industrytypelist.cpp
    script_infrastructure.cpp
    script_league.cpp
    script_list.cpp
    script_log.cpp
    script_map.cpp
    script_marine.cpp
    script_newgrf.cpp
    script_news.cpp
    script_object.cpp
    script_objecttype.cpp
    script_objecttypelist.cpp
    script_order.cpp
    script_priorityqueue.cpp
    script_rail.cpp
    script_railtypelist.cpp
    script_road.cpp
    script_roadtypelist.cpp
    script_sign.cpp
    script_signlist.cpp
    script_station.cpp
    script_stationlist.cpp
    script_story_page.cpp
    script_storypagelist.cpp
    script_storypageelementlist.cpp
    script_subsidy.cpp
    script_subsidylist.cpp
    script_testmode.cpp
    script_text.cpp
    script_tile.cpp
    script_tilelist.cpp
    script_town.cpp
    script_townlist.cpp
    script_tunnel.cpp
    script_vehicle.cpp
    script_vehiclelist.cpp
    script_viewport.cpp
    script_waypoint.cpp
    script_waypointlist.cpp
    script_window.cpp
)
