# WRF CMake Build
add_compile_options    ( "${PROJECT_COMPILE_OPTIONS}"     )
add_compile_definitions( "${PROJECT_COMPILE_DEFINITIONS}" )

#!TODO ORGANIZE THIS FOLDER
set( FOLDER_COMPILE_TARGET registry )

add_executable(
               ${FOLDER_COMPILE_TARGET}
              )

set( GEN_COMMS gen_comms.stub )
if ( ${USE_RSL_LITE} )
  message( STATUS "Setting gen_comms to RSL_LITE" )
  set( GEN_COMMS ${PROJECT_SOURCE_DIR}/external/RSL_LITE/gen_comms.c )
else()
  # Account for the weird makefile nonsense of copying things around
  set_source_files_properties( 
                              gen_comms.stub
                              TARGET_DIRECTORY ${FOLDER_COMPILE_TARGET}
                              PROPERTIES
                                LANGUAGE C
                              )
endif()

target_sources(
                ${FOLDER_COMPILE_TARGET}
                PRIVATE
                  registry.c
                  my_strtok.c
                  reg_parse.c
                  data.c
                  type.c
                  misc.c
                  gen_defs.c
                  gen_allocs.c
                  gen_mod_state_descr.c
                  gen_scalar_indices.c
                  gen_args.c
                  gen_config.c
                  sym.c
                  symtab_gen.c
                  gen_irr_diag.c
                  gen_model_data_ord.c
                  gen_interp.c
                  # gen_comms.c
                  ${GEN_COMMS}
                  gen_scalar_derefs.c
                  set_dim_strs.c
                  gen_wrf_io.c
                  gen_streams.c
                  )

# set_target_properties( 
#                       ${FOLDER_COMPILE_TARGET} 
#                         PROPERTIES
#                           Fortran_MODULE_DIRECTORY ${CMAKE_INSTALL_PREFIX}/${FOLDER_COMPILE_TARGET}
#                           Fortran_FORMAT           FREE                          
#                       )

target_include_directories( ${FOLDER_COMPILE_TARGET}
                            PRIVATE
                              ${CMAKE_CURRENT_SOURCE_DIR}
                            )

install(
        TARGETS ${FOLDER_COMPILE_TARGET}
        RUNTIME DESTINATION bin/
        ARCHIVE DESTINATION lib/
        LIBRARY DESTINATION lib/
        )

# Extra stuff for weird registry stuff
set( REGISTRY_FILE "NO_REGISTRY_FILE_SET" )
if ( ${WRF_CORE} STREQUAL "ARW" )
  
  if ( ${ENABLE_CHEM} )
    set( REGISTRY_FILE ${PROJECT_SOURCE_DIR}/Registry/Registry.EM_CHEM )

  # This check does nothing
  # elseif ( ${WRF_DFI_RADAR} )
  #   set( REGISTRY_FILE ${PROJECT_SOURCE_DIR}/Registry/Registry.EM )

  else()
    set( REGISTRY_FILE ${PROJECT_SOURCE_DIR}/Registry/Registry.EM )

  endif()

elseif ( ${WRF_CORE} STREQUAL "PLUS" )
    set( REGISTRY_FILE ${PROJECT_SOURCE_DIR}/Registry/Registry.tladj )

elseif ( ${WRF_CORE} STREQUAL "CONVERT" )
  set( REGISTRY_FILE ${PROJECT_SOURCE_DIR}/Registry/Registry.CONVERT )

elseif ( ${WRF_CORE} STREQUAL "DA" OR ${WRF_CORE} STREQUAL "DA_4D_VAR" )
  if ( ${WRF_CHEM} )
    set( REGISTRY_FILE ${PROJECT_SOURCE_DIR}/Registry/Registry.wrfchemvar )
  else()
    set( REGISTRY_FILE ${PROJECT_SOURCE_DIR}/Registry/Registry.wrfvar )
  endif()

endif()

set( dealloc_source )
foreach( n RANGE 0 11 )
  list(
        APPEND
        dealloc_source
        ${CMAKE_BINARY_DIR}/inc/deallocs_${n}.F
        )
endforeach()

set( allocs_source )
foreach( n RANGE 0 31 )
  list(
        APPEND
        allocs_source
        ${CMAKE_BINARY_DIR}/inc/allocs_${n}.F
        )
endforeach()

# Make sure this exists at the top level - I'm avoiding using cache variables deliberately
set( REGISTRY_FILE ${REGISTRY_FILE} PARENT_SCOPE )

wrf_expand_definitions( 
                        RESULT_VAR  REGISTRY_DEFS
                        DEFINITIONS ${PROJECT_COMPILE_DEFINITIONS}
                        )

# How this is not a bigger thing or not resolved is beyond me
# https://gitlab.kitware.com/cmake/cmake/-/issues/18005
# Also the suggestion does not work
add_custom_command(
                    OUTPUT
                      ${CMAKE_BINARY_DIR}/inc/nl_config.inc
                      ${CMAKE_BINARY_DIR}/frame/module_state_description.F
                      ${dealloc_source}
                      ${allocs_source}
                    COMMENT
                      "Generating registry code..."
                    WORKING_DIRECTORY
                      ${CMAKE_BINARY_DIR}
                    # Replicate what exists in project directory for registry
                    COMMAND
                      ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/Registry
                    COMMAND
                      ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/inc
                    COMMAND
                      ${CMAKE_COMMAND} -E make_directory ${CMAKE_BINARY_DIR}/frame
                    COMMAND
                      ${CMAKE_BINARY_DIR}/tools/registry ${REGISTRY_DEFS} -DNEW_BDYS ${REGISTRY_FILE} > ${CMAKE_BINARY_DIR}/registry.log 2>&1
                    #!TODO Just have the registry code actually check for failure or better yet rewrite the 
                    # registry code to not be so obfuscating
                    COMMAND 
                      ${CMAKE_COMMAND} -E compare_files ${CMAKE_BINARY_DIR}/inc/nl_config.inc ${CMAKE_BINARY_DIR}/inc/nl_config.inc
                    DEPENDS
                      ${FOLDER_COMPILE_TARGET}
                    )



add_custom_target( 
                  registry_code
                  DEPENDS
                    ${CMAKE_BINARY_DIR}/inc/nl_config.inc
                    ${CMAKE_BINARY_DIR}/frame/module_state_description.F
                    ${dealloc_source}
                    ${allocs_source}
                  )

set_source_files_properties(
                            ${CMAKE_BINARY_DIR}/frame/module_state_description.F
                            ${dealloc_source}
                            ${allocs_source}
                            DIRECTORY ${PROJECT_SOURCE_DIR}
                            PROPERTIES
                              GENERATED TRUE
                            )

target_sources(
                ${PROJECT_NAME}_Core
                PRIVATE
                  ${CMAKE_BINARY_DIR}/frame/module_state_description.F
                  ${dealloc_source}
                  ${allocs_source}
                )

