package com.github.aesteve.vertx.nubes.reflections.visitors;

import com.github.aesteve.vertx.nubes.annotations.sockjs.bridge.events.*;
import io.vertx.ext.web.handler.sockjs.BridgeEventType;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.util.EnumMap;
import java.util.HashMap;
import java.util.Map;

import static io.vertx.ext.web.handler.sockjs.BridgeEventType.*;

abstract class BridgeEventFactory {

  private static final Map<Class<? extends Annotation>, BridgeEventType> types = new HashMap<>();

  static {
    types.put(PUBLISH.class, PUBLISH);
    types.put(RECEIVE.class, RECEIVE);
    types.put(REGISTER.class, REGISTER);
    types.put(SEND.class, SEND);
    types.put(SOCKET_CLOSED.class, SOCKET_CLOSED);
    types.put(SOCKET_CREATED.class, SOCKET_CREATED);
    types.put(UNREGISTER.class, UNREGISTER);
  }

  static Map<BridgeEventType, Method> createFromController(Class<?> controller) {
    Map<BridgeEventType, Method> map = new EnumMap<>(BridgeEventType.class);
    for (Method method : controller.getMethods()) {
      createFromMethod(map, method);
    }
    return map;
  }

  private static void createFromMethod(Map<BridgeEventType, Method> map, Method method) {
    for (Annotation annot : method.getDeclaredAnnotations()) {
      createFromAnnotation(map, method, annot);
    }
  }

  private static void createFromAnnotation(Map<BridgeEventType, Method> map, Method method, Annotation annot) {
    BridgeEventType type = types.get(annot.annotationType());
    if (type != null && map.get(type) != null) {
      throw new IllegalArgumentException("You cannot register many methods on the same BridgeEvent.Type");
    }
    else {
      map.put(type, method);
    }
  }

}

@@ -1679,18 +1679,32 @@
    %7D
-%0A   
  else 
+if (type != null )
 %7B%0A  

fix NPE