#
#   Copyright (c) 2024-2025 Project CHIP Authors
#
#   Licensed 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.
#

# Define NET_L2_OPENTHREAD config for FreeRTOS compatibility with Zephyr (already defined in Zephyr module)
# to enable shared code and Kconfig across both platforms.

config OPENTHREAD
	bool
	help
	  Internal: mirrors NET_L2_OPENTHREAD so CHIP GN receives chip_enable_thread and loads OpenThread
	  declare_args (see config/common/cmake/chip_gn_kconfig_defaults.cmake).

config NET_L2_OPENTHREAD
	bool "Enable Thread support"
	select OPENTHREAD
	help
	  Enable OT support.

if NET_L2_OPENTHREAD

config OT_ROOT
	string "OT root path"
	default "third_party/openthread/ot-nxp/openthread"
	help
	  OT root path relative to Matter root

config OT_EXTERNAL_MBEDTLS
	string "Mbedtls gn target used by OT gn build system"
	default "nxp_mbedtls"
	help
	  Use "${nxp_sdk_build_root}:nxp_mbedtls" by default.
	  The full path is handled in common.cmake. If blank,
	  OT will use internal mbedtls.

config OT_EXTERNAL_PLATFORM
	string "OT external platform target used by OT gn build system"
	default "libopenthread-mcxw72" if CHIP_NXP_PLATFORM_MCXW72
	default "libopenthread-rw61x" if CHIP_NXP_PLATFORM_RW61X
	default "libopenthread-rt1060" if CHIP_NXP_PLATFORM_RT1060
	default "libopenthread-rt1170" if CHIP_NXP_PLATFORM_RT1170
	help
	  OT external platform target used by OT gn build system

config OT_PROJECT_CORE_CONFIG_FILE
	string "OT configuration file used by OT gn build system"
	default "$(CHIP_ROOT)/third_party/nxp/nxp_matter_support/examples/platform/mcxw72/app/project_include/openthread/OpenThreadConfig.h" if CHIP_NXP_PLATFORM_MCXW72
	default "$(CHIP_ROOT)/third_party/nxp/nxp_matter_support/examples/platform/rt/rw61x/app/project_include/openthread/OpenThreadConfig.h" if CHIP_NXP_PLATFORM_RW61X
	default "$(CHIP_ROOT)/third_party/nxp/nxp_matter_support/examples/platform/rt/rt1060/app/project_include/openthread/OpenThreadConfig.h" if CHIP_NXP_PLATFORM_RT1060
	default "$(CHIP_ROOT)/third_party/nxp/nxp_matter_support/examples/platform/rt/rt1170/app/project_include/openthread/OpenThreadConfig.h" if CHIP_NXP_PLATFORM_RT1170
	help
	  OT configuration file used by OT gn build system.

config OT_PROJECT_LIB_CONFIG_FILE
	string "OT project lib config file"
	default "$(CHIP_ROOT)/third_party/nxp/nxp_matter_support/examples/platform/rt/rw61x/app/project_include/openthread/OpenThreadProjectLibConfig.h" if CHIP_NXP_PLATFORM_RW61X
	help
	  OT lib config file.

config OT_CORE_CONFIG_PLATFORM_CHECK_FILE
	string "OT core configuration check file used by OT gn build system"
	default "openthread-core-mcxw72-config-check.h" if CHIP_NXP_PLATFORM_MCXW72
	default "openthread-core-rw612-config-check.h" if CHIP_NXP_PLATFORM_RW61X
	default "openthread-core-rt1060-config-check.h" if CHIP_NXP_PLATFORM_RT1060
	default "openthread-core-rt1170-config-check.h" if CHIP_NXP_PLATFORM_RT1170
	help
	  OT core configuration check file used by OT gn build system

config OT_CORE_CONFIG_DEPS
	string "OT core configuration gn deps file used by OT gn build system"
    default "third_party/openthread/platforms/nxp/mcxw72:openthread_core_config_mcxw72" if CHIP_NXP_PLATFORM_MCXW72
	default "third_party/openthread/platforms/nxp/rt/rw61x:openthread_core_config_rw61x" if CHIP_NXP_PLATFORM_RW61X
	default "third_party/openthread/platforms/nxp/rt/rt1060:openthread_core_config_rt1060" if CHIP_NXP_PLATFORM_RT1060
	default "third_party/openthread/platforms/nxp/rt/rt1170:openthread_core_config_rt1170" if CHIP_NXP_PLATFORM_RT1170
	help
	  OT core configuration gn deps file used by OT gn build system

config OT_NXP_PLATFORM_FOLDER
	string "ot-nxp platform specific folder"
	default "src/mcxw72" if CHIP_NXP_PLATFORM_MCXW72
	help
	  ot-nxp platform specific folder (relative to ot-nxp root)

config OT_NXP_SPINEL_INTERFACE_LINK
	string "spinel interface link"
	default "hdlc" if CHIP_NXP_PLATFORM_RW61X
	default "spi"
	help
		Define the spinel interface used for host transceiver communication

choice THREAD_DEVICE_TYPE_SELECTION
	prompt "Thread device type selection based on ConnectivityManager::ThreadDeviceType enum"
	default ROUTER if CHIP_NXP_PLATFORM_RW61X || CHIP_NXP_PLATFORM_RT1170 || CHIP_NXP_PLATFORM_RT1060
	default FULL_END_DEVICE
	config ROUTER
		bool "Router"
	config FULL_END_DEVICE
		bool "Full end device"
	config MINIMAL_END_DEVICE
		bool "Minimal end device"
	config SLEEPY_END_DEVICE
		bool "Sleepy end device"
	config SYNCHRONIZED_SLEEPY_END_DEVICE
		bool "Synchronized sleepy end device"
endchoice

config THREAD_DEVICE_TYPE
	string "Thread device type registered with the connectivity manager"
	default "kThreadDeviceType_Router" if ROUTER
	default "kThreadDeviceType_FullEndDevice" if FULL_END_DEVICE
	default "kThreadDeviceType_MinimalEndDevice" if MINIMAL_END_DEVICE
	default "kThreadDeviceType_SleepyEndDevice" if SLEEPY_END_DEVICE
	default "kThreadDeviceType_SynchronizedSleepyEndDevice" if SYNCHRONIZED_SLEEPY_END_DEVICE
	help
		Thread device type registered with the connectivity manager

endif # NET_L2_OPENTHREAD
