conf_data = configuration_data()
conf_data.set10('VALIDATION_UNSECURE_FEATURE', get_option('validate-unsecure-feature').enabled())
conf_data.set10('INSECURE_UNRESTRICTED_SENSOR_OVERRIDE', get_option('insecure-sensor-override').enabled())
conf_data.set10('NVMED_ENABLE_SINGLE_WOKER', get_option('single-worker').enabled())

metric_store_feature_map = {
    'disabled': 0,
    'static':  1,
    'dynamic':  2
}
metric_store_feature = metric_store_feature_map.get(get_option('metric-store'))
conf_data.set('METRIC_STORE_FEATURE', metric_store_feature)

conf_hdr = configure_file(input: 'dbus-sensor_config.h.in',
               output: 'dbus-sensor_config.h',
               configuration: conf_data)

thresholds_a = static_library(
    'thresholds_a',
    'Thresholds.cpp',
    dependencies: default_deps,
)

thresholds_dep = declare_dependency(
    link_with: [ thresholds_a ],
    dependencies: default_deps,
)

utils_a = static_library(
    'utils_a',
    [
        'FileHandle.cpp',
        'SensorPaths.cpp',
        'Utils.cpp',
    ],
    dependencies: default_deps,
)

utils_dep = declare_dependency(
    link_with: [ utils_a ],
    dependencies: [ sdbusplus, systemd ],
)

devicemgmt_a = static_library(
    'devicemgmt_a',
    [
        'DeviceMgmt.cpp',
    ],
    dependencies: default_deps,
)

devicemgmt_dep = declare_dependency(
    link_with: [ devicemgmt_a ],
    dependencies: default_deps,
)

pwmsensor_a = static_library(
    'pwmsensor_a',
    'PwmSensor.cpp',
    dependencies: [ default_deps, thresholds_dep ],
)

pwmsensor_dep = declare_dependency(
    link_with: [ pwmsensor_a ],
    dependencies: [ default_deps, thresholds_dep ],
)

peci_incdirs = []
if not meson.get_compiler('cpp').has_header('linux/peci-ioctl.h')
    peci_incdirs = ['../include']
endif

if get_option('intel-cpu').enabled()
    peci_dep = meson.get_compiler('cpp').find_library('libpeci', required : false)
    if not peci_dep.found()
      cmake = import('cmake')
      opt = cmake.subproject_options()
      opt.append_compile_args('c', '-Wno-pedantic')
      peci_proj = cmake.subproject('libpeci', options : opt)
      peci_dep = peci_proj.dependency('peci')
    endif
endif

if get_option('adc').enabled()
    executable(
        'adcsensor',
        'ADCSensor.cpp',
        'ADCSensorMain.cpp',
        dependencies: [
            default_deps,
            gpiodcxx,
            thresholds_dep,
            utils_dep,
        ],
        install: true,
    )
endif

if get_option('intel-cpu').enabled()
    executable(
        'intelcpusensor',
        'IntelCPUSensorMain.cpp',
        'IntelCPUSensor.cpp',
        dependencies: [
            default_deps,
            gpiodcxx,
            thresholds_dep,
            utils_dep,
            peci_dep,
        ],
        include_directories: peci_incdirs,
        install: true,
    )
endif

if get_option('exit-air').enabled()
    executable(
        'exitairtempsensor',
        'ExitAirTempSensor.cpp',
        dependencies: [
            default_deps,
            thresholds_dep,
            utils_dep,
        ],
        install: true,
    )
endif

if get_option('fan').enabled()
    executable(
        'fansensor',
        'FanMain.cpp',
        'TachSensor.cpp',
        'PwmSensor.cpp',
        dependencies: [
            default_deps,
            gpiodcxx,
            thresholds_dep,
            utils_dep,
        ],
        install: true,
    )
endif

if get_option('hwmon-temp').enabled()
    executable(
        'hwmontempsensor',
        'HwmonTempMain.cpp',
        'HwmonTempSensor.cpp',
        dependencies: [
            default_deps,
            devicemgmt_dep,
            thresholds_dep,
            utils_dep,
        ],
        install: true,
    )
endif

if get_option('intrusion').enabled()
    executable(
        'intrusionsensor',
        'ChassisIntrusionSensor.cpp',
        'IntrusionSensorMain.cpp',
        dependencies: [
            default_deps,
            gpiodcxx,
            i2c,
            utils_dep,
        ],
        install: true,
    )
endif

if get_option('ipmb').enabled()
    executable(
        'ipmbsensor',
        'IpmbSensor.cpp',
        'IpmbSDRSensor.cpp',
        dependencies: [
            default_deps,
            thresholds_dep,
            utils_dep,
        ],
        install: true,
    )
endif

if get_option('mcu').enabled()
    executable(
        'mcutempsensor',
        'MCUTempSensor.cpp',
        dependencies: [
            default_deps,
            i2c,
            thresholds_dep,
            utils_dep,
        ],
        install: true,
    )
endif

if get_option('nvme').enabled()
    nvme_srcs = files(
        'MctpEndpoint.cpp',
        'MctpReactorDevice.cpp',
        'NVMeSensorMain.cpp',
        'NVMeSensor.cpp',
        'NVMeBasic.cpp',
        'NVMeSubsys.cpp',
        'NVMeMi.cpp',
        'NVMeController.cpp',
        'NVMeProgress.cpp',
        'NVMeVolume.cpp',
        'NVMeDrive.cpp',
        'NVMeError.cpp',
        'NVMeStorage.cpp',
        'NVMePlugin.cpp',
        'NVMeMetricStore.cpp',
    )

    pdi_dep = phosphor_dbus_interfaces_dep
    libnvme = dependency('libnvme', 
        required : true,
        fallback : ['libnvme', 'libnvme_dep'],
        include_type: 'system'
    )
    libnvme_mi = dependency('libnvme-mi', 
        required : true,
        fallback : ['libnvme', 'libnvme_mi_dep'],
        include_type: 'system'
    )

    nvme_deps = [ 
        default_deps, i2c, thresholds_dep, utils_dep, 
        threads, pdi_dep, libnvme, libnvme_mi,
        nvme_dbus_dep
    ]

    if get_option('nvme_shmem').enabled()
        nvme_deps += [
            absl_status_dep,
            shared_mem_dep
        ]
    endif

    cxx = meson.get_compiler('cpp')

    executable(
        'nvmesensor',
        sources: nvme_srcs,
        dependencies: nvme_deps,
        cpp_args: [
            '-frtti',
            '-DBOOST_ASIO_DISABLE_EPOLL',
            '-DBOOST_ASIO_USE_TS_EXECUTOR_AS_DEFAULT',
            '-UBOOST_ASIO_NO_DEPRECATED',
            '-UBOOST_ASIO_DISABLE_THREADS',
            '-UBOOST_ASIO_HAS_IO_URING'
        ],
        link_args: cxx.get_id() == 'clang' ? ['-rdynamic'] : ['-export-dynamic'],
        install: true,
        include_directories: nvme_dbus_includes,
    )

    nvme_plugin_inc = include_directories('./')

    nvme_plugin_dep = declare_dependency(
        include_directories: nvme_plugin_inc,
        dependencies: [nvme_dbus_dep, pdi_dep, libnvme_mi], 
    )

    pkgconfig = import('pkgconfig')
    pkgconfig.generate(
        name: 'nvme-plugin', 
        version: meson.project_version(), 
        description: 'nvmed plugin package',
        subdirs: ['.', 'gen', 'nvmed']
    )

    install_headers(
        'Utils.hpp',
        'NVMePlugin.hpp',
        'NVMeUtil.hpp',
        'VariantVisitors.hpp',
        conf_hdr,
        'SensorPaths.hpp',
        'Thresholds.hpp',
        'sensor.hpp',
        'NVMeSensor.hpp',
        'NVMeCache.hpp',
        'NVMeMetricStore.hpp',
        subdir: 'nvmed'
    )

endif

if get_option('psu').enabled()
    executable(
        'psusensor',
        'PSUEvent.cpp',
        'PSUSensor.cpp',
        'PSUSensorMain.cpp',
        dependencies: [
            default_deps,
            devicemgmt_dep,
            pwmsensor_dep,
            thresholds_dep,
            utils_dep,
        ],
        install: true,
    )
endif

if get_option('external').enabled()
    executable(
        'externalsensor',
        'ExternalSensor.cpp',
        'ExternalSensorMain.cpp',
        dependencies: [
            default_deps,
            thresholds_dep,
            utils_dep,
        ],
        install: true,
    )
endif
