package chapter5.callbacks;

import io.vertx.core.AbstractVerticle;
import io.vertx.core.http.HttpServerRequest;
import io.vertx.core.json.JsonArray;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.web.client.WebClient;
import io.vertx.ext.web.client.predicate.ResponsePredicate;
import io.vertx.ext.web.codec.BodyCodec;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

public class CollectorServiceCBH extends AbstractVerticle {

  private final Logger logger = LoggerFactory.getLogger(CollectorServiceCBH.class);
  private WebClient webClient;

  @Override
  public void start() {
    webClient = WebClient.create(vertx);
    vertx.createHttpServer()
      .requestHandler(this::handleRequest)
      .listen(8080);
  }

  private void handleRequest(HttpServerRequest request) {
    List<JsonObject> responses = new ArrayList<>();
    AtomicInteger counter = new AtomicInteger(0);
    for (int i = 0; i < 3; i++) {
      webClient
        .get(3000 + i, "localhost", "/")
        .expect(ResponsePredicate.SC_SUCCESS)
        .as(BodyCodec.jsonObject())
        .send(ar -> {
          if (ar.succeeded()) {
            responses.add(ar.result().body());
          } else {
            logger.error("Sensor down?", ar.cause());
          }
          if (counter.incrementAndGet() == 3) {
            JsonObject data = new JsonObject()
              .put("data", new JsonArray(responses));
            webClient
              .post(4000, "localhost", "/")
              .expect(ResponsePredicate.SC_SUCCESS)
              .sendJsonObject(data, ar1 -> {
                if (ar1.succeeded()) {
                  request.response()
                    .putHeader("Content-Type", "application/json")
                    .end(data.encode());
                } else {
                  logger.error("Snapshot down?", ar1.cause());
                  request.response().setStatusCode(500).end();
                }
              });

          }
        });
    }
  }

}