package io.flowing.retail.adapter;

import java.io.StringReader;
import java.io.StringWriter;

import javax.json.Json;
import javax.json.JsonObject;
import javax.json.JsonReader;
import javax.json.JsonWriter;

public abstract class EventHandler {

  public void handleEvent(String eventAsJson) {
    JsonReader jsonReader = Json.createReader(new StringReader(eventAsJson));
    JsonObject event = jsonReader.readObject();
    jsonReader.close();

    String type = event.getString("type");
    String name = event.getString("name");
    
    String transactionId = null;
    if (event.containsKey("transactionId")) {
      transactionId = event.getString("transactionId");
    }

    System.out.println("[" + this.getClass().getSimpleName() + "] Received: " + type + " " + name);
    try {
      
      boolean handled = handleEvent(type, name, transactionId, event);
      if (handled) {
        System.out.println("[" + this.getClass().getSimpleName() + "] Handled: " + type + " " + name + " " + eventAsJson);
      }else {
        System.out.println("[" + this.getClass().getSimpleName() + "] Ignored " + type + " " + name + " " + eventAsJson);
      }
      
    } catch (Exception ex) {
      System.out.println(ex.getClass() + " '" + ex.getMessage() + "' while handling: " + eventAsJson);
      ex.printStackTrace();
    }    
  }

  public abstract boolean handleEvent(String type, String name, String transactionId, JsonObject event);

  public String asString(JsonObject jsonObject) {
    StringWriter eventStringWriter = new StringWriter();
    JsonWriter writer = Json.createWriter(eventStringWriter);
    writer.writeObject(jsonObject);
    writer.close();

    return eventStringWriter.toString();
  }

}