defaults = {
    'systemd': {
        'units': {},
        'services': {},
        'logind': {},
    },
    'monitoring': {
        'services': {
            'systemd': {
                'vars.command': "systemctl --failed --no-legend | wc -l | grep -q '^0$' && exit 0 || systemctl --failed && exit 2",
            },
        },
    },
}

@metadata_reactor.provides(
    'systemd/units',
)
def units(metadata):
    units = {}

    for name, config in metadata.get('systemd/units').items():
        if '/' in name:
            continue

        type = name.split('.')[-1]

        if type not in ['timer', 'service', 'network', 'netdev', 'mount', 'swap']:
            raise Exception(f'unknown type {type}')

        if not config.get('Install/WantedBy'):
            if type == 'service':
                units[name] = {
                    'Install': {
                        'WantedBy': {'multi-user.target'},
                    }
                }
            elif type == 'timer':
                units[name] = {
                    'Install': {
                        'WantedBy': {'timers.target'},
                    }
                }

    return {
        'systemd': {
            'units': units,
        }
    }


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

    for name, config in metadata.get('systemd/services').items():
        extension = name.split('.')[-1]

        if extension not in ['timer', 'service', 'mount', 'swap']:
            raise Exception(f'unknown extension: {extension}')

    return {
        'systemd': {
            'services': services,
        }
    }


@metadata_reactor.provides(
    'monitoring/services',
)
def monitoring(metadata):
    return {
        'monitoring': {
            'services': {
                name: {
                    'vars.command': f"/bin/sh -c '/usr/bin/systemctl is-failed {name} && /usr/bin/systemctl status {name} && exit 2 || exit 0'"
                }
                    for name in metadata.get('systemd/units')
                    if name.endswith('.service')
            },
        },
    }