defaults = {
    'apt': {
        'packages': {
            'smartmontools': {},
            'nvme-cli': {},
        },
    },
    'icinga2_api': {
        'smartd': {
            'services': {
                'SMARTD PROCESS': {
                    'command_on_monitored_host': '/usr/local/share/icinga/plugins/check_systemd_unit smartd',
                },
            },
        },
    },
}


@metadata_reactor.provides(
    'smartd/disks',
)
def zfs_disks_to_metadata(metadata):
    disks = set()

    for _, config in metadata.get('zfs/pools', {}).items():
        if 'device' in config:
            disks.add(config['device'])
        else:
            for t in {'mirror', 'raidz', 'raidz2', 'raidz3'}:
                for device in config.get(t, set()):
                    disks.add(device)

    return {
        'smartd': {
            'disks': disks,
        },
    }


@metadata_reactor.provides(
    'icinga2_api/smartd/services',
)
def icinga(metadata):
    services = {}

    for disk in metadata.get('smartd/disks', set()):
        services[f'SMART STATUS {disk}'] = {
            'command_on_monitored_host': f'sudo /usr/local/share/icinga/plugins/check_smart -d {disk} -i auto',
            'vars.notification.mail': True,
        }

    return {
        'icinga2_api': {
            'smartd': {
                'services': services,
            },
        },
    }


@metadata_reactor.provides(
    'telegraf/input_plugins/builtin/smart',
)
def telegraf(metadata):
    if not node.has_bundle('telegraf'):
        raise DoNotRunAgain

    if metadata.get('smartd/disks', {}):
        return {
            'telegraf': {
                'input_plugins': {
                    'builtin': {
                        'smart': [{
                            'devices': list(sorted(metadata.get('smartd/disks'))),
                        }],
                    },
                },
            },
        }

    return {}