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',
        'NVMeFeatureStore.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, nvme_proto_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: [default_deps, 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
