# NEL_DIR can be specified as root directory

# Returned variables
# NELDRIVER_XXX_BINARY_DEBUG
# NELDRIVER_XXX_BINARY_RELEASE
# NELDRIVER_XXX_LIBRARY_DEBUG
# NELDRIVER_XXX_LIBRARY_RELEASE
# NELDRIVER_XXX_FOUND
# NEL_DEFINITIONS
# NEL_INCLUDE_DIR
# NEL_INCLUDE_DIRS
# NEL_LIBRARIES
# NELXXX_FOUND
# NELXXX_LIBRARIES


INCLUDE(FindHelpers)

# Init all variables we'll set
SET(NEL_LIBRARIES)
SET(NEL_INCLUDE_DIR)
SET(NEL_INCLUDE_DIRS)
SET(NEL_VERSION)
SET(NEL_STATIC)
SET(NEL_STATIC_DRIVERS)
SET(NEL_VERSION_MAJOR)
SET(NEL_VERSION_MINOR)
SET(NEL_VERSION_PATCH)
SET(NEL_REVISION)
SET(NEL_VERSION)

SET(NEL_MODULES_FOUND)
SET(NEL_MODULES_AVAILABLE 3d georges gui ligo logic net pacs sound) # cegui pipeline

SET(NEL_DRIVERS_FOUND)
SET(NEL_DRIVERS_AVAILABLE opengl opengles direct3d dsound fmod openal xaudio2)

SET(NELMISC_FIND_REQUIRED ${NeL_FIND_REQUIRED})

# Force search of NELMISC
FIND_PACKAGE_HELPER(nelmisc nel/misc/types_nl.h RELEASE nelmisc_r nelmisc DEBUG nelmisc_d DIR ${NEL_DIR} VERBOSE QUIET)

IF(NELMISC_FOUND)
  # define NEL_DIR if not specified
  IF(NOT NEL_DIR)
    GET_FILENAME_COMPONENT(NEL_DIR ${NELMISC_INCLUDE_DIR}/.. ABSOLUTE)
  ENDIF()

  # Aliases for include directory
  SET(NEL_INCLUDE_DIR ${NELMISC_INCLUDE_DIR})
  SET(NEL_INCLUDE_DIRS ${NEL_INCLUDE_DIR})

  MESSAGE(STATUS "Found NeL headers in ${NEL_INCLUDE_DIR}")

  GET_FILENAME_COMPONENT(NEL_LIBRARY_DIR ${NELMISC_LIBRARY} DIRECTORY)

  MESSAGE(STATUS "Found NeL library in ${NEL_LIBRARY_DIR}")

  # TODO: implement static version checks for Windows

  # static libraries
  IF(UNIX)
    GET_FILENAME_COMPONENT(_LIBEXT ${NELMISC_LIBRARY} EXT)

    IF(_LIBEXT STREQUAL ".a")
      SET(NEL_STATIC ON)
      MESSAGE(STATUS "NeL is using static libraries")
    ENDIF()
  ENDIF()

  IF(WIN32)
    SET(NELDRIVER_DIRS_TO_CHECK
      ${NEL_DIR}/bin${LIB_SUFFIX}
      ${NEL_DIR}
    )
  ELSE()
    SET(NELDRIVER_DIRS_TO_CHECK
      /usr/local/lib/${CMAKE_LIBRARY_ARCHITECTURE}/nel
      /usr/local/lib/${CMAKE_LIBRARY_ARCHITECTURE}
      /usr/lib/${CMAKE_LIBRARY_ARCHITECTURE}/nel
      /usr/lib/${CMAKE_LIBRARY_ARCHITECTURE}
      /usr/lib/nel
      /usr/lib
    )
  ENDIF()

  # check for static drivers
  FOREACH(_DRIVER ${NEL_DRIVERS_AVAILABLE})
    IF(WIN32)
      SET(_DRIVER_RELASE_FILE "nel_drv_${_DRIVER}_win_r")
      SET(_DRIVER_DEBUG_FILE "nel_drv_${_DRIVER}_win_d")
      SET(_DRIVER_SHARED_EXT dll)
      SET(_DRIVER_STATIC_EXT lib)
    ELSE()
      SET(_DRIVER_RELEASE_FILE "nel_drv_${_DRIVER}")
      SET(_DRIVER_DEBUG_FILE)
      SET(_DRIVER_SHARED_EXT so)
      SET(_DRIVER_STATIC_EXT a)
    ENDIF()

    STRING(TOUPPER ${_DRIVER} _UPDRIVER)

    FOREACH(_DIR ${NELDRIVER_DIRS_TO_CHECK})
      SET(_FOUND OFF)

      IF(_DRIVER_RELASE_FILE)
        SET(_FILE "${_DIR}/${_DRIVER_RELASE_FILE}.${_DRIVER_SHARED_EXT}")
        IF(EXISTS ${_FILE})
          SET(NELDRIVER_${_UPDRIVER}_BINARY_RELEASE ${_FILE})

          MESSAGE(STATUS "Found NeL release shared driver ${_DRIVER}: ${_FILE}")

          SET(NEL_STATIC_DRIVERS OFF)

          IF(NOT NEL_DRIVER_DIR)
            SET(NEL_DRIVER_DIR ${_DIR})
          ENDIF()
        ENDIF()

        SET(_FILE "${_DIR}/${_DRIVER_RELASE_FILE}.${_DRIVER_STATIC_EXT}")
        IF(EXISTS ${_FILE})
          SET(NELDRIVER_${_UPDRIVER}_LIBRARY_RELEASE ${_FILE})

          MESSAGE(STATUS "Found NeL release static driver ${_DRIVER}: ${_FILE}")

          SET(NEL_STATIC_DRIVERS ON)

          IF(NOT NEL_DRIVER_DIR)
            SET(NEL_DRIVER_DIR ${_DIR})
          ENDIF()
        ENDIF()
      ENDIF()

      IF(_DRIVER_DEBUG_FILE)
        SET(_FILE "${_DIR}/${_DRIVER_RELASE_FILE}.${_DRIVER_SHARED_EXT}")
        IF(EXISTS ${_FILE})
          SET(NELDRIVER_${_UPDRIVER}_BINARY_DEBUG ${_FILE})

          MESSAGE(STATUS "Found NeL debug shared driver ${_DRIVER}: ${_FILE}")

          SET(NEL_STATIC_DRIVERS OFF)

          IF(NOT NEL_DRIVER_DIR)
            SET(NEL_DRIVER_DIR ${_DIR})
          ENDIF()
        ENDIF()

        SET(_FILE "${_DIR}/${_DRIVER_RELASE_FILE}.${_DRIVER_STATIC_EXT}")
        IF(EXISTS ${_FILE})
          SET(NELDRIVER_${_UPDRIVER}_LIBRARY_DEBUG ${_FILE})

          MESSAGE(STATUS "Found NeL debug static driver ${_DRIVER}: ${_FILE}")

          SET(NEL_STATIC_DRIVERS ON)

          IF(NOT NEL_DRIVER_DIR)
            SET(NEL_DRIVER_DIR ${_DIR})
          ENDIF()
        ENDIF()

        IF(_FOUND)
          SET(NELDRIVER_${_UPDRIVER}_FOUND ON)
          LIST(APPEND NEL_DRIVERS_FOUND ${_DRIVER})
        ENDIF()
      ENDIF()
    ENDFOREACH()
  ENDFOREACH()

  MESSAGE(STATUS "Found NeL driver in ${NEL_DRIVER_DIR}")

  PARSE_VERSION_OTHER(${NEL_INCLUDE_DIR}/nel/misc/version_nl.h NL_VERSION_MAJOR NL_VERSION_MINOR NL_VERSION_PATCH NL_REVISION)

  SET(NEL_VERSION_MAJOR ${NL_VERSION_MAJOR})
  SET(NEL_VERSION_MINOR ${NL_VERSION_MINOR})
  SET(NEL_VERSION_PATCH ${NL_VERSION_PATCH})
  SET(NEL_REVISION ${NL_REVISION})

  IF(NOT NEL_VERSION)
    IF(NEL_VERSION_MAJOR OR NEL_VERSION_MINOR} OR NEL_VERSION_PATCH)
      SET(NEL_VERSION "${NEL_VERSION_MAJOR}.${NEL_VERSION_MINOR}.${NEL_VERSION_PATCH}")
    ELSE()
      SET(NEL_VERSION "0.5.0")
    ENDIF()

    IF(NEL_REVISION)
      SET(NEL_VERSION "${NEL_VERSION}.${NEL_REVISION}")
    ENDIF()
  ENDIF()

  FIND_PACKAGE(PNG REQUIRED)
  IF(PNG_FOUND)
    LIST(APPEND NELMISC_LIBRARIES ${PNG_LIBRARIES})
  ENDIF()

  FIND_PACKAGE(Jpeg REQUIRED)
  IF(JPEG_FOUND)
    LIST(APPEND NELMISC_LIBRARIES ${JPEG_LIBRARY})
  ENDIF()

  FIND_PACKAGE(GIF)

  IF(GIF_FOUND)
    LIST(APPEND NELMISC_LIBRARIES ${GIF_LIBRARY})
  ENDIF()

  FIND_LIBXML2()

  IF(LIBXML2_FOUND)
    LIST(APPEND NELMISC_LIBRARIES ${LIBXML2_LIBRARIES})
  ENDIF()

  LIST(REMOVE_ITEM NeL_FIND_COMPONENTS misc)

  LIST(APPEND NEL_MODULES_FOUND misc)
  LIST(APPEND NEL_LIBRARIES ${NELMISC_LIBRARIES})
ENDIF()

IF(NOT NeL_FIND_COMPONENTS)
  SET(NeL_FIND_COMPONENTS ${NEL_MODULES_AVAILABLE})

  # We can skip not installed modules
  SET(NeL_FIND_REQUIRED OFF)
ENDIF()

FOREACH(COMPONENT ${NeL_FIND_COMPONENTS})
  SET(_NAME NeL${COMPONENT})
  STRING(TOUPPER ${_NAME} _UPNAME)

  # module is required
  SET(${_NAME}_FIND_REQUIRED ${NeL_FIND_REQUIRED})

  IF(COMPONENT STREQUAL "3d")
    SET(HEADER_FILE shape.h)
#  ELSEIF(COMPONENT STREQUAL "cegui")
#    SET(HEADER_FILE shape.h)
  ELSEIF(COMPONENT STREQUAL "georges")
    SET(HEADER_FILE form.h)
  ELSEIF(COMPONENT STREQUAL "gui")
    SET(HEADER_FILE reflect.h)
  ELSEIF(COMPONENT STREQUAL "ligo")
    SET(HEADER_FILE primitive.h)
  ELSEIF(COMPONENT STREQUAL "logic")
    SET(HEADER_FILE logic_state.h)
  ELSEIF(COMPONENT STREQUAL "net")
    SET(HEADER_FILE sock.h)
  ELSEIF(COMPONENT STREQUAL "pacs")
    SET(HEADER_FILE primitive_block.h)
#  ELSEIF(COMPONENT STREQUAL "pipeline")
#    SET(HEADER_FILE shape.h)
  ELSEIF(COMPONENT STREQUAL "sound")
    SET(HEADER_FILE shape.h)
  ELSE()
    SET(HEADER_FILE)
  ENDIF()

  # display if a component has a wrong name
  IF(NOT HEADER_FILE)
    MESSAGE(STATUS "NeL module ${COMPONENT} not supported, ignoring it...")
    CONTINUE()
  ENDIF()

  FIND_PACKAGE_HELPER(${_NAME} nel/${COMPONENT}/${HEADER_FILE}
    RELEASE nel${COMPONENT}_r nel${COMPONENT}
    DEBUG nel${COMPONENT}_d
    QUIET)

  IF(${_UPNAME}_FOUND)
    LIST(APPEND NEL_MODULES_FOUND ${COMPONENT})

    IF(COMPONENT STREQUAL "3d")
      IF(NEL_STATIC)
        # 3rd party dependencies
        FIND_PACKAGE(Freetype REQUIRED)
        IF(FREETYPE_FOUND)
          LIST(APPEND ${_UPNAME}_LIBRARIES ${FREETYPE_LIBRARIES})
        ENDIF()

        # Append static 3D drivers
        IF(NEL_STATIC_DRIVERS)
          # Direct3D driver (only under Windows)
          IF(WIN32)
            IF(NELDRIVER_DIRECT3D_LIBRARY_DEBUG)
              LIST(APPEND ${_UPNAME}_LIBRARIES debug ${NELDRIVER_DIRECT3D_LIBRARY_DEBUG})
            ENDIF()

            IF(NELDRIVER_DIRECT3D_LIBRARY_RELEASE)
              LIST(APPEND ${_UPNAME}_LIBRARIES optimized ${NELDRIVER_DIRECT3D_LIBRARY_RELEASE})
            ENDIF()
          ENDIF()

          # OpenGL driver
          IF(NELDRIVER_OPENGL_LIBRARY_DEBUG)
            LIST(APPEND ${_UPNAME}_LIBRARIES debug ${NELDRIVER_OPENGL_LIBRARY_DEBUG})
          ENDIF()

          IF(NELDRIVER_OPENGL_LIBRARY_RELEASE)
            LIST(APPEND ${_UPNAME}_LIBRARIES optimized ${NELDRIVER_OPENGL_LIBRARY_RELEASE})
          ENDIF()
        ENDIF()
      ENDIF()
    ELSEIF(COMPONENT STREQUAL "gui")
      FIND_PACKAGE(Luabind REQUIRED)

      LIST(APPEND ${_UPNAME}_LIBRARIES ${LUABIND_LIBRARIES})

      FIND_LIBCURL()

      IF(CURL_FOUND)
        LIST(APPEND ${_UPNAME}_LIBRARIES ${CURL_LIBRARIES})
        LIST(APPEND ${_UPNAME}_DEFINITIONS ${CURL_DEFINITIONS})
      ENDIF()

      # TODO: remove complately OpenSSL requirement on Windows

      # Only used by libcurl under Linux
      FIND_PACKAGE(OpenSSL REQUIRED)

      IF(WIN32)
        LIST(APPEND OPENSSL_LIBRARIES Crypt32.lib)
      ENDIF()

      # Only Linux version of libcurl depends on OpenSSL
      LIST(APPEND CURL_INCLUDE_DIRS ${OPENSSL_INCLUDE_DIR})
      LIST(APPEND CURL_LIBRARIES ${OPENSSL_LIBRARIES})

      LIST(APPEND ${_UPNAME}_LIBRARIES ${LUABIND_LIBRARIES} ${CURL_LIBRARIES})
      LIST(APPEND NEL_DEFINITIONS ${${_UPNAME}_DEFINITIONS})
    ELSEIF(COMPONENT STREQUAL "sound")
      FIND_PACKAGE(Ogg REQUIRED)

      IF(OGG_FOUND)
        LIST(APPEND ${_UPNAME}_LIBRARIES ${OGG_LIBRARY})
      ENDIF()

      FIND_PACKAGE(Vorbis REQUIRED)

      IF(VORBIS_FOUND)
        LIST(APPEND ${_UPNAME}_LIBRARIES ${VORBIS_LIBRARY} ${VORBISFILE_LIBRARY})
      ENDIF()

      IF(NEL_STATIC)
        # Link to snd_lowlevel
        FIND_LIBRARY_HELPER(nelsnd_lowlevel RELEASE nelsnd_lowlevel_r DEBUG nelsnd_lowlevel_d DIR ${NEL_DIR} REQUIRED)

        IF(NELSND_LOWLEVEL_LIBRARIES)
          MESSAGE(STATUS "Found NeL sound lowlevel ${NELSND_LOWLEVEL_LIBRARIES}")

          LIST(APPEND NELSOUND_LIBRARIES ${NELSND_LOWLEVEL_LIBRARIES})

          IF(NEL_STATIC_DRIVERS)
            # DirectSound, XAudio2 and FMod drivers (only under Windows)
            IF(WIN32)
              # DirectSound
              IF(NELDRIVER_DIRECTSOUND_LIBRARY_DEBUG)
                LIST(APPEND NELSOUND_LIBRARIES debug ${NELDRIVER_DIRECTSOUND_LIBRARY_DEBUG})
              ENDIF()

              IF(NELDRIVER_DIRECTSOUND_LIBRARY_RELEASE)
                LIST(APPEND NELSOUND_LIBRARIES optimized ${NELDRIVER_DIRECTSOUND_LIBRARY_RELEASE})
              ENDIF()

              # FMod
              IF(NELDRIVER_FMOD_LIBRARY_DEBUG)
                LIST(APPEND NELSOUND_LIBRARIES debug ${NELDRIVER_FMOD_LIBRARY_DEBUG})
              ENDIF()

              IF(NELDRIVER_FMOD_LIBRARY_RELEASE)
                LIST(APPEND NELSOUND_LIBRARIES optimized ${NELDRIVER_FMOD_LIBRARY_RELEASE})
              ENDIF()

              # XAudio2
              IF(NELDRIVER_XAUDIO2_LIBRARY_DEBUG)
                LIST(APPEND NELSOUND_LIBRARIES debug ${NELDRIVER_XAUDIO2_LIBRARY_DEBUG})
              ENDIF()

              IF(NELDRIVER_XAUDIO2_LIBRARY_RELEASE)
                LIST(APPEND NELSOUND_LIBRARIES optimized ${NELDRIVER_XAUDIO2_LIBRARY_RELEASE})
              ENDIF()
            ENDIF()

            # OpenAL driver
            IF(NELDRIVER_OPENAL_LIBRARY_DEBUG)
              LIST(APPEND NELSOUND_LIBRARIES debug ${NELDRIVER_OPENAL_LIBRARY_DEBUG})
            ENDIF()

            IF(NELDRIVER_OPENAL_LIBRARY_RELEASE)
              LIST(APPEND NELSOUND_LIBRARIES optimized ${NELDRIVER_OPENAL_LIBRARY_RELEASE})
            ENDIF()
          ENDIF()
        ENDIF()
      ENDIF()
    ENDIF()

    LIST(APPEND NEL_LIBRARIES ${${_UPNAME}_LIBRARIES})
  ENDIF()
ENDFOREACH()

MESSAGE_VERSION_PACKAGE_HELPER(NeL ${NEL_VERSION} ${NEL_MODULES_FOUND})