package com.adleytales.vertxdemo;

import io.vertx.core.AbstractVerticle;
import io.vertx.core.Vertx;
import io.vertx.core.impl.logging.Logger;
import io.vertx.core.impl.logging.LoggerFactory;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.web.Router;
import io.vertx.mysqlclient.MySQLConnectOptions;
import io.vertx.mysqlclient.MySQLPool;
import io.vertx.sqlclient.PoolOptions;
import io.vertx.sqlclient.SqlConnection;
import io.vertx.sqlclient.Tuple;

import java.util.ArrayList;
import java.util.Collections;

public class MainVerticle extends AbstractVerticle {
Logger logger = LoggerFactory.getLogger(this.getClass());

Router router;

//第一步 配置连接参数
MySQLConnectOptions connectOptions = new MySQLConnectOptions()
.setPort(3306)
.setHost("127.0.0.1")
.setDatabase("test")
.setUser("root")
.setPassword("root");

//第二步 配置连接池 Pool options
PoolOptions poolOptions = new PoolOptions()
.setMaxSize(5);

//第三步 Create the client pool
MySQLPool client;

public static void main(String[] args) {
Vertx.vertx().deployVerticle(MainVerticle.class.getName());
}

@Override
public void start() throws Exception {
router = Router.router(vertx);

client = MySQLPool.pool(vertx, connectOptions, poolOptions);

router.get("/api").handler(ctx -> {
logger.info("age= " + ctx.request().getParam("age"));

// Get a connection from the pool
client.getConnection(r -> {
if (!r.succeeded()) {
var retData = new JsonObject()
.put("code", -10001)
.put("message", r.cause().getMessage())
.put("alert", "服务忙,请稍后尝试(-10001)");
ctx.json(retData);
return;
}

//
SqlConnection conn = r.result();
conn
.preparedQuery("select id,name,age,info from user where id = ?")
.execute(Tuple.of(2), r2 -> {
conn.close();

if (!r2.succeeded()){
var retData = new JsonObject()
.put("code", -10001)
.put("message", r.cause());
ctx.json(retData);
return;
}

var list = new ArrayList<JsonObject>();
r2.result().forEach(item -> {
var json = new JsonObject();
json.put("id", item.getValue("id"));
json.put("name", item.getValue("name"));
json.put("age", item.getValue("age"));
json.put("info", item.getValue("info"));
list.add(json);
});

ctx.json(list);
});
});
});

vertx.createHttpServer()
.requestHandler(router)
.listen(8888)
.onSuccess(server -> {
System.out.println("server is running at PORT " + server.actualPort());
});
}
}