#!/usr/bin/env python3
# Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
# for details. All rights reserved. Use of this source code is governed by a
# BSD-style license that can be found in the LICENSE file.
"""This module provides functionality to generate dart:html event classes."""

import logging
import monitored

_logger = logging.getLogger('dartgenerator')

# Events without onEventName attributes in the  IDL we want to support.
# We can automatically extract most event names by checking for
# onEventName methods in the IDL but some events aren't listed so we need
# to manually add them here so that they are easy for users to find.
_html_manual_events = monitored.Dict(
    'htmleventgenerator._html_manual_events', {
        'Element': ['ontouchleave', 'ontouchenter', 'ontransitionend'],
        'HTMLCanvasElement': ['onwebglcontextlost', 'onwebglcontextrestored'],
        'Window': ['onDOMContentLoaded']
    })

# These event names must be camel case when attaching event listeners
# using addEventListener even though the onEventName properties in the DOM for
# them are not camel case.
_on_attribute_to_event_name_mapping = monitored.Dict(
    'htmleventgenerator._on_attribute_to_event_name_mapping', {
        'webkitanimationend': 'webkitAnimationEnd',
        'webkitanimationiteration': 'webkitAnimationIteration',
        'webkitanimationstart': 'webkitAnimationStart',
        'webkitspeechchange': 'webkitSpeechChange',
    })

_html_event_types = monitored.Dict(
    'htmleventgenerator._html_event_types',
    {
        '*.abort': ('abort', 'Event'),
        '*.beforecopy': ('beforeCopy', 'Event'),
        '*.beforecut': ('beforeCut', 'Event'),
        '*.beforepaste': ('beforePaste', 'Event'),
        '*.beforeunload': ('beforeUnload', 'Event'),
        '*.blur': ('blur', 'Event'),
        '*.canplay': ('canPlay', 'Event'),
        '*.canplaythrough': ('canPlayThrough', 'Event'),
        '*.change': ('change', 'Event'),
        '*.click': ('click', 'MouseEvent'),
        '*.contextmenu': ('contextMenu', 'MouseEvent'),
        '*.copy': ('copy', 'ClipboardEvent'),
        '*.cut': ('cut', 'ClipboardEvent'),
        '*.dblclick': ('doubleClick', 'Event'),
        '*.drag': ('drag', 'MouseEvent'),
        '*.dragend': ('dragEnd', 'MouseEvent'),
        '*.dragenter': ('dragEnter', 'MouseEvent'),
        '*.dragleave': ('dragLeave', 'MouseEvent'),
        '*.dragover': ('dragOver', 'MouseEvent'),
        '*.dragstart': ('dragStart', 'MouseEvent'),
        '*.drop': ('drop', 'MouseEvent'),
        '*.durationchange': ('durationChange', 'Event'),
        '*.emptied': ('emptied', 'Event'),
        '*.ended': ('ended', 'Event'),
        '*.error': ('error', 'Event'),
        '*.focus': ('focus', 'Event'),
        # Should be HashChangeEvent, but IE does not support it.
        '*.hashchange': ('hashChange', 'Event'),
        '*.input': ('input', 'Event'),
        '*.invalid': ('invalid', 'Event'),
        '*.keydown': ('keyDown', 'KeyboardEvent'),
        '*.keypress': ('keyPress', 'KeyboardEvent'),
        '*.keyup': ('keyUp', 'KeyboardEvent'),
        '*.load': ('load', 'Event'),
        '*.loadeddata': ('loadedData', 'Event'),
        '*.loadedmetadata': ('loadedMetadata', 'Event'),
        '*.message': ('message', 'MessageEvent'),
        '*.mousedown': ('mouseDown', 'MouseEvent'),
        '*.mouseenter': ('mouseEnter', 'MouseEvent'),
        '*.mouseleave': ('mouseLeave', 'MouseEvent'),
        '*.mousemove': ('mouseMove', 'MouseEvent'),
        '*.mouseout': ('mouseOut', 'MouseEvent'),
        '*.mouseover': ('mouseOver', 'MouseEvent'),
        '*.mouseup': ('mouseUp', 'MouseEvent'),
        '*.mousewheel': ('mouseWheel', 'WheelEvent'),
        '*.offline': ('offline', 'Event'),
        '*.online': ('online', 'Event'),
        '*.paste': ('paste', 'ClipboardEvent'),
        '*.pause': ('pause', 'Event'),
        '*.play': ('play', 'Event'),
        '*.playing': ('playing', 'Event'),
        '*.popstate': ('popState', 'PopStateEvent'),
        '*.ratechange': ('rateChange', 'Event'),
        '*.reset': ('reset', 'Event'),
        '*.resize': ('resize', 'Event'),
        '*.scroll': ('scroll', 'Event'),
        '*.search': ('search', 'Event'),
        '*.seeked': ('seeked', 'Event'),
        '*.seeking': ('seeking', 'Event'),
        '*.select': ('select', 'Event'),
        '*.selectstart': ('selectStart', 'Event'),
        '*.stalled': ('stalled', 'Event'),
        '*.storage': ('storage', 'StorageEvent'),
        '*.submit': ('submit', 'Event'),
        '*.suspend': ('suspend', 'Event'),
        '*.timeupdate': ('timeUpdate', 'Event'),
        '*.touchcancel': ('touchCancel', 'TouchEvent'),
        '*.touchend': ('touchEnd', 'TouchEvent'),
        '*.touchenter': ('touchEnter', 'TouchEvent'),
        '*.touchleave': ('touchLeave', 'TouchEvent'),
        '*.touchmove': ('touchMove', 'TouchEvent'),
        '*.touchstart': ('touchStart', 'TouchEvent'),
        '*.unload': ('unload', 'Event'),
        '*.volumechange': ('volumeChange', 'Event'),
        '*.waiting': ('waiting', 'Event'),
        '*.webkitAnimationEnd': ('animationEnd', 'AnimationEvent'),
        '*.webkitAnimationIteration': ('animationIteration', 'AnimationEvent'),
        '*.webkitAnimationStart': ('animationStart', 'AnimationEvent'),
        '*.transitionend': ('transitionEnd', 'TransitionEvent'),
        '*.webkitfullscreenchange': ('fullscreenChange', 'Event'),
        '*.webkitfullscreenerror': ('fullscreenError', 'Event'),
        '*.wheel': ('wheel', 'WheelEvent'),
        'AbstractWorker.error': ('error', 'Event'),
        'AccessibleNode.accessibleclick': ('accessibleClick', 'Event'),
        'AccessibleNode.accessiblecontextmenu':
        ('accessibleContextMenu', 'Event'),
        'AccessibleNode.accessibledecrement': ('accessibleDecrement', 'Event'),
        'AccessibleNode.accessiblefocus': ('accessibleFocus', 'Event'),
        'AccessibleNode.accessibleincrement': ('accessibleIncrement', 'Event'),
        'AccessibleNode.accessiblescrollintoview':
        ('accessibleScrollIntoView', 'Event'),
        'Animation.finish': ('finish', 'Event'),
        'Animation.cancel': ('cancel', 'Event'),
        'AudioContext.complete': ('complete', 'Event'),
        'ApplicationCache.cached': ('cached', 'Event'),
        'ApplicationCache.checking': ('checking', 'Event'),
        'ApplicationCache.downloading': ('downloading', 'Event'),
        'ApplicationCache.noupdate': ('noUpdate', 'Event'),
        'ApplicationCache.obsolete': ('obsolete', 'Event'),
        'ApplicationCache.progress': ('progress', 'ProgressEvent'),
        'ApplicationCache.updateready': ('updateReady', 'Event'),
        'CompositorWorker.error': ('error', 'Event'),
        'Document.readystatechange': ('readyStateChange', 'Event'),
        'Document.securitypolicyviolation':
        ('securityPolicyViolation', 'SecurityPolicyViolationEvent'),
        'Document.selectionchange': ('selectionChange', 'Event'),
        'Document.pointerlockchange': ('pointerLockChange', 'Event'),
        'Document.pointerlockerror': ('pointerLockError', 'Event'),
        'EventSource.open': ('open', 'Event'),
        'FileReader.abort': ('abort', 'ProgressEvent'),
        'FileReader.error': ('error', 'ProgressEvent'),
        'FileReader.load': ('load', 'ProgressEvent'),
        'FileReader.loadend': ('loadEnd', 'ProgressEvent'),
        'FileReader.loadstart': ('loadStart', 'ProgressEvent'),
        'FileReader.progress': ('progress', 'ProgressEvent'),
        'FileWriter.abort': ('abort', 'ProgressEvent'),
        'FileWriter.progress': ('progress', 'ProgressEvent'),
        'FileWriter.write': ('write', 'ProgressEvent'),
        'FileWriter.writeend': ('writeEnd', 'ProgressEvent'),
        'FileWriter.writestart': ('writeStart', 'ProgressEvent'),
        'FontFaceSet.loading': ('loading', 'FontFaceSetLoadEvent'),
        'FontFaceSet.loadingdone': ('loadingDone', 'FontFaceSetLoadEvent'),
        'FontFaceSet.loadingerror': ('loadingError', 'FontFaceSetLoadEvent'),
        'HTMLBodyElement.storage': ('storage', 'StorageEvent'),
        'HTMLCanvasElement.webglcontextlost':
        ('webGlContextLost', 'gl.ContextEvent'),
        'HTMLCanvasElement.webglcontextrestored':
        ('webGlContextRestored', 'gl.ContextEvent'),
        'HTMLInputElement.webkitSpeechChange': ('speechChange', 'Event'),
        'HTMLFormElement.autocomplete': ('autocomplete', 'Event'),
        'HTMLFormElement.autocompleteerror':
        ('autocompleteError', 'AutocompleteErrorEvent'),
        'HTMLMediaElement.loadstart': ('loadStart', 'Event'),
        'HTMLMediaElement.progress': ('progress', 'Event'),
        'HTMLMediaElement.show': ('show', 'Event'),
        'HTMLMediaElement.webkitkeyadded': ('keyAdded', 'MediaKeyEvent'),
        'HTMLMediaElement.webkitkeyerror': ('keyError', 'MediaKeyEvent'),
        'HTMLMediaElement.webkitkeymessage': ('keyMessage', 'MediaKeyEvent'),
        'HTMLMediaElement.webkitneedkey': ('needKey', 'MediaKeyEvent'),
        'IDBDatabase.close': ('close', 'Event'),
        'IDBDatabase.versionchange': ('versionChange', 'VersionChangeEvent'),
        'IDBOpenDBRequest.blocked': ('blocked', 'Event'),
        'IDBOpenDBRequest.upgradeneeded':
        ('upgradeNeeded', 'VersionChangeEvent'),
        'IDBRequest.success': ('success', 'Event'),
        'IDBTransaction.complete': ('complete', 'Event'),
        'MediaKeySession.webkitkeyadded': ('keyAdded', 'MediaKeyEvent'),
        'MediaKeySession.webkitkeyerror': ('keyError', 'MediaKeyEvent'),
        'MediaKeySession.webkitkeymessage': ('keyMessage', 'MediaKeyEvent'),
        'MediaStream.addtrack': ('addTrack', 'Event'),
        'MediaStream.removetrack': ('removeTrack', 'Event'),
        'MediaStreamTrack.mute': ('mute', 'Event'),
        'MediaStreamTrack.unmute': ('unmute', 'Event'),
        'MIDIAccess.connect': ('connect', 'MidiConnectionEvent'),
        'MIDIAccess.disconnect': ('disconnect', 'MidiConnectionEvent'),
        'MIDIInput.midimessage': ('midiMessage', 'MidiMessageEvent'),
        'MIDIPort.disconnect': ('disconnect', 'MidiConnectionEvent'),
        'Notification.click': ('click', 'Event'),
        'Notification.close': ('close', 'Event'),
        'Notification.display': ('display', 'Event'),
        'Notification.show': ('show', 'Event'),
        'Performance.webkitresourcetimingbufferfull':
        ('resourceTimingBufferFull', 'Event'),
        'RTCDTMFSender.tonechange': ('toneChange', 'RtcDtmfToneChangeEvent'),
        'RTCDataChannel.close': ('close', 'Event'),
        'RTCDataChannel.open': ('open', 'Event'),
        'RTCPeerConnection.addstream': ('addStream', 'MediaStreamEvent'),
        'RTCPeerConnection.datachannel': ('dataChannel', 'RtcDataChannelEvent'),
        'RTCPeerConnection.icecandidate':
        ('iceCandidate', 'RtcPeerConnectionIceEvent'),
        'RTCPeerConnection.iceconnectionstatechange':
        ('iceConnectionStateChange', 'Event'),
        'RTCPeerConnection.negotiationneeded': ('negotiationNeeded', 'Event'),
        'RTCPeerConnection.removestream': ('removeStream', 'MediaStreamEvent'),
        'RTCPeerConnection.signalingstatechange':
        ('signalingStateChange', 'Event'),
        'RTCPeerConnection.track': ('track', 'RtcTrackEvent'),
        'ScriptProcessorNode.audioprocess':
        ('audioProcess', 'AudioProcessingEvent'),
        'ServiceWorkerGlobalScope.activate': ('activate', 'Event'),
        'ServiceWorkerGlobalScope.fetch': ('fetch', 'Event'),
        'ServiceWorkerGlobalScope.install': ('install', 'Event'),
        'ServiceWorkerGlobalScope.foreignfetch':
        ('foreignfetch', 'ForeignFetchEvent'),
        'SharedWorker.error': ('error', 'Event'),
        'SharedWorkerGlobalScope.connect': ('connect', 'Event'),
        'SpeechRecognition.audioend': ('audioEnd', 'Event'),
        'SpeechRecognition.audiostart': ('audioStart', 'Event'),
        'SpeechRecognition.end': ('end', 'Event'),
        'SpeechRecognition.error': ('error', 'SpeechRecognitionError'),
        'SpeechRecognition.nomatch': ('noMatch', 'SpeechRecognitionEvent'),
        'SpeechRecognition.result': ('result', 'SpeechRecognitionEvent'),
        'SpeechRecognition.soundend': ('soundEnd', 'Event'),
        'SpeechRecognition.soundstart': ('soundStart', 'Event'),
        'SpeechRecognition.speechend': ('speechEnd', 'Event'),
        'SpeechRecognition.speechstart': ('speechStart', 'Event'),
        'SpeechRecognition.start': ('start', 'Event'),
        'SpeechSynthesisUtterance.boundary':
        ('boundary', 'SpeechSynthesisEvent'),
        'SpeechSynthesisUtterance.end': ('end', 'SpeechSynthesisEvent'),
        'SpeechSynthesisUtterance.mark': ('mark', 'SpeechSynthesisEvent'),
        'SpeechSynthesisUtterance.resume': ('resume', 'SpeechSynthesisEvent'),
        'SpeechSynthesisUtterance.start': ('start', 'SpeechSynthesisEvent'),
        'TextTrack.cuechange': ('cueChange', 'Event'),
        'TextTrackCue.enter': ('enter', 'Event'),
        'TextTrackCue.exit': ('exit', 'Event'),
        'TextTrackList.addtrack': ('addTrack', 'TrackEvent'),
        'WebSocket.close': ('close', 'CloseEvent'),
        'WebSocket.open':
        ('open', 'Event'),  # should be OpenEvent, but not exposed.
        'Window.DOMContentLoaded': ('contentLoaded', 'Event'),
        'Window.devicemotion': ('deviceMotion', 'DeviceMotionEvent'),
        'Window.deviceorientation':
        ('deviceOrientation', 'DeviceOrientationEvent'),
        'Window.loadstart': ('loadStart', 'Event'),
        'Window.pagehide': ('pageHide', 'Event'),
        'Window.pageshow': ('pageShow', 'Event'),
        'Window.progress': ('progress', 'Event'),
        'Window.webkittransitionend':
        ('webkitTransitionEnd', 'TransitionEvent'),
        'Window.wheel': ('wheel', 'WheelEvent'),
        'Worker.error': ('error', 'Event'),
        'XMLHttpRequestEventTarget.abort': ('abort', 'ProgressEvent'),
        'XMLHttpRequestEventTarget.error': ('error', 'ProgressEvent'),
        'XMLHttpRequestEventTarget.load': ('load', 'ProgressEvent'),
        'XMLHttpRequestEventTarget.loadend': ('loadEnd', 'ProgressEvent'),
        'XMLHttpRequestEventTarget.loadstart': ('loadStart', 'ProgressEvent'),
        'XMLHttpRequestEventTarget.progress': ('progress', 'ProgressEvent'),
        'XMLHttpRequestEventTarget.timeout': ('timeout', 'ProgressEvent'),
        'XMLHttpRequest.readystatechange': ('readyStateChange', 'Event'),
    })

# These classes require an explicit declaration for the "on" method even though
# they don't declare any unique events, because the concrete class hierarchy
# doesn't match the interface hierarchy.
_html_explicit_event_classes = set(['DocumentFragment'])


class HtmlEventGenerator(object):

    def __init__(self, database, renamer, metadata, template_loader):
        self._event_classes = set()
        self._database = database
        self._renamer = renamer
        self._metadata = metadata
        self._template_loader = template_loader
        self._media_events = None

    def EmitStreamProviders(self, interface, custom_events, members_emitter,
                            library_name):

        events = self._GetEvents(interface, custom_events)
        if not events:
            return

        for event_info in events:
            (dom_name, html_name, event_type) = event_info
            annotation_name = dom_name + 'Event'

            # If we're using a different provider, then don't declare one.
            if self._GetEventRedirection(interface, html_name, event_type):
                continue

            annotations = self._metadata.FormatMetadata(
                self._metadata.GetMetadata(library_name, interface,
                                           annotation_name, 'on' + dom_name),
                '  ')

            members_emitter.Emit(
                "\n"
                "  $(ANNOTATIONS)static const EventStreamProvider<$TYPE> "
                "$(NAME)Event = const EventStreamProvider<$TYPE>('$DOM_NAME');\n",
                ANNOTATIONS=annotations,
                NAME=html_name,
                DOM_NAME=dom_name,
                TYPE=event_type)

    def EmitStreamGetters(self,
                          interface,
                          custom_events,
                          members_emitter,
                          library_name,
                          stream_getter_signatures_emitter=None,
                          element_stream_getters_emitter=None):

        events = self._GetEvents(interface, custom_events)
        if not events:
            return

        for event_info in events:
            (dom_name, html_name, event_type) = event_info
            getter_name = 'on%s%s' % (html_name[:1].upper(), html_name[1:])
            annotation_name = 'on' + dom_name

            # If the provider is declared elsewhere, point to that.
            redirection = self._GetEventRedirection(interface, html_name,
                                                    event_type)
            if redirection:
                provider = '%s.%sEvent' % (redirection, html_name)
            else:
                provider = html_name + 'Event'

            annotations = self._metadata.GetFormattedMetadata(
                library_name, interface, annotation_name, '  ')

            isElement = False
            for parent in self._database.Hierarchy(interface):
                if parent.id == 'Element':
                    isElement = True
            # We add the same event stream getters Element, ElementList, and
            # _FrozenElementList. So, in impl_Element.darttemplate, we have two
            # additional emitters to add the correct variation of the stream getter
            # for that context.
            for emitter in [
                    members_emitter, stream_getter_signatures_emitter,
                    element_stream_getters_emitter
            ]:
                if emitter == None:
                    continue
                elem_type = 'Element' if isElement else ''
                call_name = 'forElement' if isElement else 'forTarget'
                if emitter == element_stream_getters_emitter:
                    call_name = '_forElementList'
                emitter.Emit(
                    "\n"
                    "  $(ANNOTATIONS)$(ELEM_TYPE)Stream<$TYPE> get $(NAME)$BODY;\n",
                    ANNOTATIONS=annotations,
                    ELEM_TYPE=elem_type,
                    NAME=getter_name,
                    BODY=('' if emitter == stream_getter_signatures_emitter else
                          ' => %s.%s(this)' % ((
                              ('' if emitter != element_stream_getters_emitter
                               else 'Element.') + provider), call_name)),
                    TYPE=event_type)

    def _GetRawEvents(self, interface):
        all_interfaces = (
            [interface] + self._database.TransitiveSecondaryParents(
                interface, False))
        events = set([])
        for super_interface in all_interfaces:
            events = events.union(
                set([
                    attr.id
                    for attr in super_interface.attributes
                    if (attr.type.id == 'EventHandler' or
                        attr.type.id == 'EventListener')
                ]))
        return events

    def _GetEvents(self, interface, custom_events):
        """ Gets a list of all of the events for the specified interface.
    """
        html_interface_name = interface.doc_js_name

        events = self._GetRawEvents(interface)

        if html_interface_name in _html_manual_events:
            events.update(_html_manual_events[html_interface_name])

        if not events and interface.id not in _html_explicit_event_classes:
            return None

        dom_event_names = set()
        for event in events:
            dom_name = event[2:]
            dom_name = _on_attribute_to_event_name_mapping.get(
                dom_name, dom_name)
            dom_event_names.add(dom_name)

        events = []
        for dom_name in sorted(dom_event_names):
            event_info = self._FindEventInfo(html_interface_name, dom_name)
            if not event_info:
                continue

            (html_name, event_type) = event_info
            if self._IsEventSuppressed(interface, html_name, event_type):
                continue

            full_event_name = '%sEvents.%s' % (html_interface_name, html_name)
            if not full_event_name in custom_events:
                events.append((dom_name, html_name, event_type))
        return events

    def _HasEvent(self, events, event_name, event_type):
        """ Checks if the event is declared in the list of events (from _GetEvents),
    with the same event type.
    """
        for (dom_name, html_name, found_type) in events:
            if html_name == event_name and event_type == found_type:
                return True
        return False

    def _IsEventSuppressed(self, interface, event_name, event_type):
        """ Checks if the event should not be emitted.
    """
        if self._renamer.ShouldSuppressMember(interface, event_name, 'on:'):
            return True

        if (interface.doc_js_name == 'Window' or
                interface.doc_js_name == 'Element' or
                interface.doc_js_name == 'Document' or
                interface.doc_js_name == 'GlobalEventHandlers'):
            media_interface = self._database.GetInterface('HTMLMediaElement')
            if not self._media_events:
                self._media_events = self._GetEvents(media_interface, [])
            if self._HasEvent(self._media_events, event_name, event_type):
                return True

    def _GetEventRedirection(self, interface, event_name, event_type):
        """ For events which are declared in one place, but exposed elsewhere,
    this gets the source of the event (where the provider is declared)
    """
        if interface.doc_js_name == 'Window' or interface.doc_js_name == 'Document':
            element_interface = self._database.GetInterface('Element')
            element_events = self._GetEvents(element_interface, [])
            if self._HasEvent(element_events, event_name, event_type):
                return 'Element'
        return None

    def _FindEventInfo(self, html_interface_name, dom_event_name):
        """ Finds the event info (event name and type).
    """
        key = '%s.%s' % (html_interface_name, dom_event_name)
        if key in _html_event_types:
            return _html_event_types[key]
        key = '*.%s' % dom_event_name
        if key in _html_event_types:
            return _html_event_types[key]
        _logger.warn('Cannot resolve event type for %s.%s' %
                     (html_interface_name, dom_event_name))
        return None
