# DOS utilities for mars-nwe.
#
# Default install mode uses a split:
#   - legacy command names are installed from netold.exe
#   - new command names that netold.exe does not contain are installed from net.exe
#
# Maintainer mode can rebuild the new net.exe with Open Watcom.  The freshly
# built binary is only installed when MARS_NWE_INSTALL_NEW_DOSUTILS is ON, or
# for the new-only command names in the default split install.

option(MAINTAINER_BUILD "Enable maintainer-only DOS tool helpers and diagnostics" OFF)

set(MARS_DOSUTILS_LEGACY_NET_EXE
    "${CMAKE_CURRENT_SOURCE_DIR}/netold.exe"
    CACHE FILEPATH "Legacy/pre-Client32 DOS net.exe used by default for legacy command names"
)

set(MARS_DOSUTILS_NEW_NET_EXE
    "${CMAKE_CURRENT_SOURCE_DIR}/net.exe"
    CACHE FILEPATH "New/experimental DOS net.exe used for new-only tools or when MARS_NWE_INSTALL_NEW_DOSUTILS is ON"
)

set(MARS_DOSUTILS_LEGACY_TOOLS
    net
    login
    profile
    spawn
    passwd
    path
    pathins
    pathdel
    map
    mapdel
    logout
    capture
    endcap
)

# Tools not present in netold.exe.  These are installed from the new binary
# even in the default split mode.
set(MARS_DOSUTILS_NEW_ONLY_TOOLS
    slist
    flag
    flagdir
    rights
    grant
    revoke
    remove
    ndir
    creator
    whoami
    ncopy
)

if(MARS_NWE_BUILD_DOSUTILS)
    find_package(OpenWatcom REQUIRED)

    set(DOSUTILS_C_SOURCES
        net.c
        tools.c
        netcall.c
        ncpcall.c
        login.c
        map.c
        slist.c
        ndir.c
        flag.c
        flagdir.c
        rights.c
        grant.c
        revoke.c
        remove.c
        trustee.c
        ncpapi.c
        nwcrypt.c
        nwdebug.c
        nwtests.c
        capture.c
        creator.c
        whoami.c
        ncopy.c
    )

    add_custom_command(
        OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/ipx.obj"
        COMMAND "${CMAKE_COMMAND}" -E env ${OPENWATCOM_ENV}
                "${OPENWATCOM_WASM}"
                -q
                -zq
                -fo="${CMAKE_CURRENT_BINARY_DIR}/ipx.obj"
                "${CMAKE_CURRENT_SOURCE_DIR}/ipx.asm"
        DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/ipx.asm"
        WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
        VERBATIM
    )

    add_custom_command(
        OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/ncp.obj"
        COMMAND "${CMAKE_COMMAND}" -E env ${OPENWATCOM_ENV}
                "${OPENWATCOM_WASM}"
                -q
                -zq
                -fo="${CMAKE_CURRENT_BINARY_DIR}/ncp.obj"
                "${CMAKE_CURRENT_SOURCE_DIR}/ncp.asm"
        DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/ncp.asm"
        WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
        VERBATIM
    )

    set(DOSUTILS_OBJECTS)
    foreach(src IN LISTS DOSUTILS_C_SOURCES)
        get_filename_component(obj_name "${src}" NAME_WE)
        set(obj "${CMAKE_CURRENT_BINARY_DIR}/${obj_name}.obj")
        list(APPEND DOSUTILS_OBJECTS "${obj}")

        set(DOSUTILS_WCL_DEFS)
        if(MAINTAINER_BUILD)
            list(APPEND DOSUTILS_WCL_DEFS -dMAINTAINER_BUILD)
        endif()

        add_custom_command(
            OUTPUT "${obj}"
            COMMAND "${CMAKE_COMMAND}" -E env ${OPENWATCOM_ENV}
                    "${OPENWATCOM_WCL}"
                    -q
                    -zq
                    -bt=dos
                    -ml
                    -0
                    ${DOSUTILS_WCL_DEFS}
                    -c
                    -fo="${obj}"
                    "${CMAKE_CURRENT_SOURCE_DIR}/${src}"
            DEPENDS
                    "${CMAKE_CURRENT_SOURCE_DIR}/${src}"
                    "${CMAKE_CURRENT_SOURCE_DIR}/net.h"
                    "${CMAKE_CURRENT_SOURCE_DIR}/ipx.h"
                    "${CMAKE_CURRENT_SOURCE_DIR}/ncp.h"
                    "${CMAKE_CURRENT_SOURCE_DIR}/ncpapi.h"
                    "${CMAKE_CURRENT_SOURCE_DIR}/nwcrypt.h"
            WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
            VERBATIM
        )
    endforeach()

    add_custom_command(
        OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/net.exe"
        COMMAND "${CMAKE_COMMAND}" -E env ${OPENWATCOM_ENV}
                "${OPENWATCOM_WCL}"
                -q
                -zq
                -bt=dos
                -ml
                -0
                -k32768
                -fe="${CMAKE_CURRENT_BINARY_DIR}/net.exe"
                ${DOSUTILS_OBJECTS}
                "${CMAKE_CURRENT_BINARY_DIR}/ipx.obj"
                "${CMAKE_CURRENT_BINARY_DIR}/ncp.obj"
        DEPENDS
                ${DOSUTILS_OBJECTS}
                "${CMAKE_CURRENT_BINARY_DIR}/ipx.obj"
                "${CMAKE_CURRENT_BINARY_DIR}/ncp.obj"
        WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
        VERBATIM
    )

    add_custom_target(dosutils_net ALL
        DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/net.exe"
    )

    set(MARS_DOSUTILS_BUILT_NET_EXE "${CMAKE_CURRENT_BINARY_DIR}/net.exe")

    if(MAINTAINER_BUILD)
        add_custom_command(
            OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/dlystrt.exe"
            COMMAND "${CMAKE_COMMAND}" -E env ${OPENWATCOM_ENV}
                    "${OPENWATCOM_WCL}"
                    -q
                    -zq
                    -bt=dos
                    -ms
                    -0
                    -dMAINTAINER_BUILD
                    -fe="${CMAKE_CURRENT_BINARY_DIR}/dlystrt.exe"
                    "${CMAKE_CURRENT_SOURCE_DIR}/dlystrt.c"
            DEPENDS "${CMAKE_CURRENT_SOURCE_DIR}/dlystrt.c"
            WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}"
            VERBATIM
        )

        add_custom_target(dlystrt ALL
            DEPENDS "${CMAKE_CURRENT_BINARY_DIR}/dlystrt.exe"
        )
    endif()
else()
    set(MARS_DOSUTILS_BUILT_NET_EXE "")
endif()

if(MARS_NWE_BUILD_DOSUTILS)
    set(MARS_DOSUTILS_SELECTED_NEW_EXE "${MARS_DOSUTILS_BUILT_NET_EXE}")
else()
    set(MARS_DOSUTILS_SELECTED_NEW_EXE "${MARS_DOSUTILS_NEW_NET_EXE}")
endif()

if(MARS_NWE_INSTALL_NEW_DOSUTILS)
    set(MARS_DOSUTILS_SELECTED_LEGACY_EXE "${MARS_DOSUTILS_SELECTED_NEW_EXE}")
else()
    set(MARS_DOSUTILS_SELECTED_LEGACY_EXE "${MARS_DOSUTILS_LEGACY_NET_EXE}")
endif()

set(MARS_DOSUTILS_SELECTED_LEGACY_IS_BUILT FALSE)
set(MARS_DOSUTILS_SELECTED_NEW_IS_BUILT FALSE)
if(MARS_NWE_BUILD_DOSUTILS)
    if(MARS_DOSUTILS_SELECTED_LEGACY_EXE STREQUAL MARS_DOSUTILS_BUILT_NET_EXE)
        set(MARS_DOSUTILS_SELECTED_LEGACY_IS_BUILT TRUE)
    endif()
    if(MARS_DOSUTILS_SELECTED_NEW_EXE STREQUAL MARS_DOSUTILS_BUILT_NET_EXE)
        set(MARS_DOSUTILS_SELECTED_NEW_IS_BUILT TRUE)
    endif()
endif()

if(MARS_NWE_INSTALL_DOSUTILS)
    if(NOT MARS_DOSUTILS_SELECTED_LEGACY_IS_BUILT AND NOT EXISTS "${MARS_DOSUTILS_SELECTED_LEGACY_EXE}")
        message(FATAL_ERROR
            "Selected legacy/default DOS utility missing: ${MARS_DOSUTILS_SELECTED_LEGACY_EXE}. "
            "Commit dosutils/netold.exe, enable MARS_NWE_INSTALL_NEW_DOSUTILS, "
            "or enable MARS_NWE_BUILD_DOSUTILS."
        )
    endif()

    if(NOT MARS_DOSUTILS_SELECTED_NEW_IS_BUILT AND NOT EXISTS "${MARS_DOSUTILS_SELECTED_NEW_EXE}")
        message(FATAL_ERROR
            "Selected new DOS utility missing: ${MARS_DOSUTILS_SELECTED_NEW_EXE}. "
            "Commit dosutils/net.exe or enable MARS_NWE_BUILD_DOSUTILS."
        )
    endif()

    message(STATUS "DOS legacy/default utility binary: ${MARS_DOSUTILS_SELECTED_LEGACY_EXE}")
    message(STATUS "DOS new-only utility binary: ${MARS_DOSUTILS_SELECTED_NEW_EXE}")

    foreach(tool IN LISTS MARS_DOSUTILS_LEGACY_TOOLS)
        if(tool STREQUAL "net")
            install(FILES "${MARS_DOSUTILS_SELECTED_LEGACY_EXE}"
                DESTINATION "${MARS_NWE_INSTALL_FULL_FILEDIR}/SYS/public"
                RENAME net.exe)
        else()
            install(FILES "${MARS_DOSUTILS_SELECTED_LEGACY_EXE}"
                DESTINATION "${MARS_NWE_INSTALL_FULL_FILEDIR}/SYS/public"
                RENAME "${tool}.exe")
        endif()
    endforeach()

    foreach(tool IN LISTS MARS_DOSUTILS_NEW_ONLY_TOOLS)
        install(FILES "${MARS_DOSUTILS_SELECTED_NEW_EXE}"
            DESTINATION "${MARS_NWE_INSTALL_FULL_FILEDIR}/SYS/public"
            RENAME "${tool}.exe")
    endforeach()

    install(FILES "${MARS_DOSUTILS_SELECTED_LEGACY_EXE}"
        DESTINATION "${MARS_NWE_INSTALL_FULL_FILEDIR}/SYS/login"
        RENAME login.exe)

    install(FILES "${MARS_DOSUTILS_SELECTED_LEGACY_EXE}"
        DESTINATION "${MARS_NWE_INSTALL_FULL_FILEDIR}/SYS/login"
        RENAME map.exe)

    install(FILES "${MARS_DOSUTILS_SELECTED_LEGACY_EXE}"
        DESTINATION "${MARS_NWE_INSTALL_FULL_FILEDIR}/SYS/login"
        RENAME slist.exe)

    if(MAINTAINER_BUILD AND MARS_NWE_BUILD_DOSUTILS)
        install(FILES "${CMAKE_CURRENT_BINARY_DIR}/dlystrt.exe"
            DESTINATION "${MARS_NWE_INSTALL_FULL_FILEDIR}/SYS/public"
            RENAME dlystrt.exe)
    endif()
endif()
