/*
 * Copyright 2011 Google Inc.
 * 
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 * 
 * http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package com.google.web.bindery.event.shared;

import com.google.web.bindery.event.shared.Event.Type;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.ListIterator;
import java.util.Map;
import java.util.Set;

/**
 * Basic implementation of {@link EventBus}.
 */
public class SimpleEventBus extends EventBus {
  private interface Command {
    void execute();
  }

  private final boolean isReverseOrder;

  private int firingDepth = 0;

  /**
   * Add and remove operations received during dispatch.
   */
  private List<Command> deferredDeltas;

  /**
   * Map of event type to map of event source to list of their handlers.
   */
  private final Map<Event.Type<?>, Map<Object, List<?>>> map =
      new HashMap<Event.Type<?>, Map<Object, List<?>>>();

  public SimpleEventBus() {
    this(false);
  }

  /**
   * Allows creation of an instance that fires its handlers in the reverse of
   * the order in which they were added, although filtered handlers all fire
   * before unfiltered handlers.
   * <p>
   * 
   * @deprecated This is a legacy feature, required by GWT's old HandlerManager.
   *             Reverse order is not honored for handlers tied to a specific
   *             event source (via {@link #addHandlerToSource}.
   */
  @Deprecated
  protected SimpleEventBus(boolean fireInReverseOrder) {
    isReverseOrder = fireInReverseOrder;
  }

  @Override
  public <H> HandlerRegistration addHandler(Type<H> type, H handler) {
    return doAdd(type, null, handler);
  }

  @Override
  public <H> HandlerRegistration addHandlerToSource(final Event.Type<H> type, final Object source,
      final H handler) {
    if (source == null) {
      throw new NullPointerException("Cannot add a handler with a null source");
    }

    return doAdd(type, source, handler);
  }

  @Override
  public void fireEvent(Event<?> event) {
    doFire(event, null);
  }

  @Override
  public void fireEventFromSource(Event<?> event, Object source) {
    if (source == null) {
      throw new NullPointerException("Cannot fire from a null source");
    }
    doFire(event, source);
  }

  /**
   * @deprecated required by legacy features in GWT's old HandlerManager
   */
  @Deprecated
  protected <H> void doRemove(Event.Type<H> type, Object source, H handler) {
    if (firingDepth > 0) {
      enqueueRemove(type, source, handler);
    } else {
      doRemoveNow(type, source, handler);
    }
  }

  /**
   * @deprecated required by legacy features in GWT's old HandlerManager
   */
  @Deprecated
  protected <H> H getHandler(Event.Type<H> type, int index) {
    assert index < getHandlerCount(type) : "handlers for " + type.getClass() + " have size: "
        + getHandlerCount(type) + " so do not have a handler at index: " + index;

    List<H> l = getHandlerList(type, null);
    return l.get(index);
  }

  /**
   * @deprecated required by legacy features in GWT's old HandlerManager
   */
  @Deprecated
  protected int getHandlerCount(Event.Type<?> eventKey) {
    return getHandlerList(eventKey, null).size();
  }

  /**
   * @deprecated required by legacy features in GWT's old HandlerManager
   */
  @Deprecated
  protected boolean isEventHandled(Event.Type<?> eventKey) {
    return map.containsKey(eventKey);
  }

  private void defer(Command command) {
    if (deferredDeltas == null) {
      deferredDeltas = new ArrayList<Command>();
    }
    deferredDeltas.add(command);
  }

  private <H> HandlerRegistration doAdd(final Event.Type<H> type, final Object source,
      final H handler) {
    if (type == null) {
      throw new NullPointerException("Cannot add a handler with a null type");
    }
    if (handler == null) {
      throw new NullPointerException("Cannot add a null handler");
    }

    if (firingDepth > 0) {
      enqueueAdd(type, source, handler);
    } else {
      doAddNow(type, source, handler);
    }

    return new HandlerRegistration() {
      public void removeHandler() {
        doRemove(type, source, handler);
      }
    };
  }

  private <H> void doAddNow(Event.Type<H> type, Object source, H handler) {
    List<H> l = ensureHandlerList(type, source);
    l.add(handler);
  }

  private <H> void doFire(Event<H> event, Object source) {
    if (event == null) {
      throw new NullPointerException("Cannot fire null event");
    }
    try {
      firingDepth++;

      if (source != null) {
        event.setSource(source);
      }

      List<H> handlers = getDispatchList(event.getAssociatedType(), source);
      Set<Throwable> causes = null;

      ListIterator<H> it =
          isReverseOrder ? handlers.listIterator(handlers.size()) : handlers.listIterator();
      while (isReverseOrder ? it.hasPrevious() : it.hasNext()) {
        H handler = isReverseOrder ? it.previous() : it.next();

        try {
          event.dispatch(handler);
        } catch (Throwable e) {
          if (causes == null) {
            causes = new HashSet<Throwable>();
          }
          causes.add(e);
        }
      }

      if (causes != null) {
        throw new UmbrellaException(causes);
      }
    } finally {
      firingDepth--;
      if (firingDepth == 0) {
        handleQueuedAddsAndRemoves();
      }
    }
  }

  private <H> void doRemoveNow(Event.Type<H> type, Object source, H handler) {
    List<H> l = getHandlerList(type, source);

    boolean removed = l.remove(handler);
    assert removed : "redundant remove call";
    if (removed && l.isEmpty()) {
      prune(type, source);
    }
  }

  private <H> void enqueueAdd(final Event.Type<H> type, final Object source, final H handler) {
    defer(new Command() {
      public void execute() {
        doAddNow(type, source, handler);
      }
    });
  }

  private <H> void enqueueRemove(final Event.Type<H> type, final Object source, final H handler) {
    defer(new Command() {
      public void execute() {
        doRemoveNow(type, source, handler);
      }
    });
  }

  private <H> List<H> ensureHandlerList(Event.Type<H> type, Object source) {
    Map<Object, List<?>> sourceMap = map.get(type);
    if (sourceMap == null) {
      sourceMap = new HashMap<Object, List<?>>();
      map.put(type, sourceMap);
    }

    // safe, we control the puts.
    @SuppressWarnings("unchecked")
    List<H> handlers = (List<H>) sourceMap.get(source);
    if (handlers == null) {
      handlers = new ArrayList<H>();
      sourceMap.put(source, handlers);
    }

    return handlers;
  }

  private <H> List<H> getDispatchList(Event.Type<H> type, Object source) {
    List<H> directHandlers = getHandlerList(type, source);
    if (source == null) {
      return directHandlers;
    }

    List<H> globalHandlers = getHandlerList(type, null);

    List<H> rtn = new ArrayList<H>(directHandlers);
    rtn.addAll(globalHandlers);
    return rtn;
  }

  private <H> List<H> getHandlerList(Event.Type<H> type, Object source) {
    Map<Object, List<?>> sourceMap = map.get(type);
    if (sourceMap == null) {
      return Collections.emptyList();
    }

    // safe, we control the puts.
    @SuppressWarnings("unchecked")
    List<H> handlers = (List<H>) sourceMap.get(source);
    if (handlers == null) {
      return Collections.emptyList();
    }

    return handlers;
  }

  private void handleQueuedAddsAndRemoves() {
    if (deferredDeltas != null) {
      try {
        for (Command c : deferredDeltas) {
          c.execute();
        }
      } finally {
        deferredDeltas = null;
      }
    }
  }

  private void prune(Event.Type<?> type, Object source) {
    Map<Object, List<?>> sourceMap = map.get(type);

    List<?> pruned = sourceMap.remove(source);

    assert pruned != null : "Can't prune what wasn't there";
    assert pruned.isEmpty() : "Pruned unempty list!";

    if (sourceMap.isEmpty()) {
      map.remove(type);
    }
  }
}