# This file is part of cloud-init. See LICENSE file for license information.

"""Classes and functions related to event handling."""

import copy

from cloudinit import log as logging
from cloudinit import util


LOG = logging.getLogger(__name__)


# Event types which can generate maintenance requests for cloud-init.
class EventType(object):
    BOOT = "System boot"
    BOOT_NEW_INSTANCE = "New instance first boot"
    HOTPLUG = "Hotplug add event"

    # TODO: Cloud-init will grow support for the follow event types:
    # METADATA_CHANGE
    # USER_REQUEST


EventTypeMap = {
    'boot': EventType.BOOT,
    'boot-new-instance': EventType.BOOT_NEW_INSTANCE,
    'hotplug': EventType.HOTPLUG,
}


# inverted mapping
iteritems = lambda d: ((hasattr(d, 'iteritems') and d.iteritems) or d.items)()
EventNameMap = {}
for k, v in iteritems(EventTypeMap):
    EventNameMap[v] = k


def get_allowed_events(sys_events, ds_events):
    '''Merge datasource capabilties with system config to determine which
       update events are allowed.'''

    # updates:
    #   policy-version: 1
    #   network:
    #     when: [boot-new-instance, boot, hotplug]
    #   storage:
    #     when: [boot-new-instance, hotplug]
    #     watch: http://169.254.169.254/metadata/storage_config/

    LOG.debug('updates: system   cfg: %s', sys_events)
    LOG.debug('updates: datasrc caps: %s', ds_events)

    events = {}
    for etype in [scope for scope, val in sys_events.items()
                  if type(val) == dict and 'when' in val]:
        ds_ecap = ds_events.get(etype, {}).get('when', [])
        LOG.debug('updates: datasrc %s cap: %s', etype, ds_ecap)
        events[etype] = (
            set([EventTypeMap.get(evt)
                 for evt in sys_events.get(etype, {}).get('when', [])
                 if evt in EventTypeMap and evt in ds_ecap]))

    LOG.debug('updates: allowed events: %s', events)
    return events


def get_update_events_config(update_events):
    '''Return a dictionary of updates config'''
    evt_cfg = {'policy-version': 1}
    for scope, events in update_events.items():
        evt_cfg[scope] = {'when': [EventNameMap[evt] for evt in events]}

    return evt_cfg

# vi: ts=4 expandtab
