package com.xxxcom.xxxproduct;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.xxxcom.model.vo.Msg_Vo;
import com.xxxcom.util.JDBCUtil;

import io.vertx.core.AbstractVerticle;
import io.vertx.core.Future;
import io.vertx.core.Vertx;
import io.vertx.core.http.HttpServerResponse;
import io.vertx.core.json.JsonArray;
import io.vertx.core.json.JsonObject;
import io.vertx.ext.sql.SQLConnection;
import io.vertx.ext.web.Router;
import io.vertx.ext.web.RoutingContext;
import io.vertx.ext.web.handler.BodyHandler;
import io.vertx.ext.web.handler.StaticHandler;

public class XXXSrv extends AbstractVerticle {

	public XXXSrv() {
		vertx = Vertx.vertx();

	}
	JDBCUtil jdbc =new JDBCUtil();

	@Override
	public void start() throws Exception {
		/*
		 * EventBus eb = vertx.eventBus(); eb.consumer("abc", // 这个是微服务监听地址(功能号)
		 * r -> { // 处理函数 try {
		 * 
		 * JsonObject request = (JsonObject) r.body(); // 微服务之间通信采用JSON String
		 * param1 = request.getString("param1"); // 这里获取参数 String param2 =
		 * request.getString("param2");
		 * 
		 * r.reply(makeReply(0, "", "world")); } catch (Exception e) {
		 * r.reply(makeReply(-1, "未知错误", null)); }
		 * 
		 * });
		 */
		/*
		 * System.out.println("begin"); final JDBCClient client =
		 * JDBCClient.createShared(vertx, new JsonObject().put("url",
		 * "jdbc:postgresql://120.76.158.63:5432/iot") .put("driver_class",
		 * "org.postgresql.Driver") .put("max_pool_size", 10).put("username",
		 * "postgres") .put("password", "Nmamtf_098"));
		 * 
		 * client.getConnection(conn -> { if (conn.failed()) {
		 * System.out.println("1111");
		 * System.err.println(conn.cause().getMessage()); return; }
		 * System.out.println(12223); final SQLConnection connection =
		 * conn.result(); connection.execute(
		 * "create table test(id int primary key, name varchar(255))", res -> {
		 * if (res.failed()) { throw new RuntimeException(res.cause()); } //
		 * insert some test data connection.execute(
		 * "insert into test values(1, 'Hello')", insert -> { // query some data
		 * connection.query("select * from test", rs -> { for (JsonArray line :
		 * rs.result().getResults()) { System.out.println(line.encode()); }
		 * 
		 * // and close the connection connection.close(done -> { if
		 * (done.failed()) { throw new RuntimeException(done.cause()); } }); });
		 * }); }); });
		 */
	}

	@Override
	public void stop() throws Exception {

	}

	private JsonObject makeReply(int code, String msg, Object data) {
		if (data == null) {
			data = new JsonObject();
		}
		return new JsonObject().put("result", new JsonObject().put("code", code).put("msg", msg)).put("data", data);
	}

	public static void main(String[] args) {
		// Create an HTTP server which simply returns "Hello World!" to each
		// request.
		Vertx.vertx().createHttpServer().requestHandler(req -> req.response().end("Hello World!")).listen(9090);
	}

	@Override
	public void start(Future<Void> fut) {
  
		Router router = Router.router(vertx);
		 
		// 页面访问地址
		router.route("/my/*").handler(StaticHandler.create("my"));

		vertx.createHttpServer().requestHandler(router::accept).listen(
				// Retrieve the port from the configuration
				config().getInteger("http.port", 8080), result -> {
					if (result.succeeded()) {
						fut.complete();
					} else {
						fut.fail(result.cause());
					}
		});

		 
		// 获取列表
		//router.get("/api/getUsers").handler(this::getAll);
		
	    router.route("/api/user*").handler(BodyHandler.create());// 设置全局请求
	   // 获取列表
	 	 router.get("/api/user/list").handler(this::getAll);
		// 添加
		router.post("/api/user").handler(this::adduser);
		// 修改
		router.put("/api/user").handler(this::updateuser);
		// 删除
		router.delete("/api/user/:id").handler(this::deleteuser);
	}

	// 查询
	private void getAll(RoutingContext routingContext) {
		System.out.println("load in");
		 
		HttpServerResponse response = routingContext.response();
		//JDBCUtil jdbc = new JDBCUtil();
	/*	jdbc.getConnection(vertx).setHandler(conn->{ 
			if(conn.succeeded()){
				SQLConnection conns=conn.result();
				conns.query(" SELECT id,name FROM auth.test where deleted=false ", query -> {
					System.out.println("quert:"+query.cause());
					if (query.failed()) {
						sendError(500, response);
					} else {
						JsonArray arr = new JsonArray();
						query.result().getRows().forEach(arr::add);
						System.out.println("quert success");
						response.putHeader("content-type", "application/json").end(arr.encode());
					}
				}); 
			}else{
				System.out.println("fails");
				sendError(500, response);
			}
		});*/
		JsonArray array=new JsonArray();
		
		jdbc.query(vertx, " SELECT id,name FROM auth.test where deleted=false ", array)
		.setHandler(xx->{
			Gson gs = new GsonBuilder()
			        .serializeNulls()
			        .create();
			if(xx.succeeded()){
				Msg_Vo msg=xx.result();
				
				String res=gs.toJson(msg);
				 
				response.putHeader("content-type", "application/json").end(res);
			}else{
                Msg_Vo msg=new Msg_Vo(-1, "数据异常");
				String res=gs.toJson(msg);
				response.putHeader("content-type", "application/json").end(res);
			}
		});
		 
	}

	// 删除
	private void deleteuser(RoutingContext routingContext) {
		String id = routingContext.request().getParam("id");
		HttpServerResponse response = routingContext.response();
		if (id == null) {
			sendError(400, response);
		} else {
			JDBCUtil jdbc = new JDBCUtil();
			jdbc.getConnection(vertx).setHandler(conn->{
				SQLConnection conns=conn.result();
				conns.queryWithParams("SELECT id,name FROM auth.test where id = ?", new JsonArray().add(Integer.parseInt(id)),
						query -> {
							if (query.failed()) {
								sendError(500, response);
							} else {
								if (query.result().getNumRows() == 0) {
									sendError(404, response);
								} else {
									conns.updateWithParams("update auth.test set deleted=true where id=? ",
											new JsonArray().add(id), edit -> {
												if (edit.failed()) {
													sendError(500, routingContext.response());
												} else {
													routingContext.response().end();
												}
											});
								}
							}
						});
			});
			

			
		}
	}

	// 添加
	private void adduser(RoutingContext routingContext) {

		/*
		 * final Users user = Json.decodeValue(routingContext.getBodyAsString(),
		 * Users.class); users.put(user.getId(), user);
		 * routingContext.response().setStatusCode(201).putHeader(
		 * "content-type", "application/json; charset=utf-8")
		 * .end(Json.encodePrettily(user));
		 */

		 
		JsonObject user = routingContext.getBodyAsJson();
		JDBCUtil jdbc = new JDBCUtil();
		jdbc.getConnection(vertx).setHandler(conn->{
			SQLConnection conns=conn.result();
			conns.updateWithParams("INSERT INTO auth.test (name) VALUES (?)", new JsonArray().add(user.getString("name")),
					query -> {
						System.out.println("username:"+user.getString("name"));
						if (query.failed()) {
							sendError(500, routingContext.response());
						} else {
							routingContext.response().end();
						}
					});
		});
		
	}

	private void sendError(int statusCode, HttpServerResponse response) {
		response.setStatusCode(statusCode).end();
	}

	// 获取
	private void getUser(RoutingContext routingContext) {
		String id = routingContext.request().getParam("id");
		HttpServerResponse response = routingContext.response();
		if (id == null) {
			sendError(400, response);
		} else {
			JDBCUtil jdbc = new JDBCUtil();
			jdbc.getConnection(vertx).setHandler(conn->{
				SQLConnection conns=conn.result();
				conns.queryWithParams("SELECT id,name FROM test where id = ?", new JsonArray().add(Integer.parseInt(id)),
						query -> {
							if (query.failed()) {
								sendError(500, response);
							} else {
								if (query.result().getNumRows() == 0) {
									sendError(404, response);
								} else {
									response.putHeader("content-type", "application/json")
											.end(query.result().getRows().get(0).encode());
								}
							}
						});
			});
			
		}
	}

	// 修改
	private void updateuser(RoutingContext routingContext) {

		HttpServerResponse response = routingContext.response();
		JsonObject user = routingContext.getBodyAsJson();
		if (user == null || user.getInteger("id") == null) {
			sendError(400, response);
		} else {
			
			int id = user.getInteger("id");
			JDBCUtil jdbc = new JDBCUtil();
			jdbc.getConnection(vertx).setHandler(conn->{
				SQLConnection conns=conn.result();
				conns.queryWithParams("SELECT id,name FROM auth.test where id = ?", new JsonArray().add(id), query -> {
					if (query.failed()) {
						sendError(500, response);
					} else {
						if (query.result().getNumRows() == 0) {
							sendError(404, response);
						} else {
							conns.updateWithParams("update auth.test set name=? where id=? ",
									new JsonArray().add(user.getString("name")).add(id), edit -> {
										if (edit.failed()) {
											sendError(500, routingContext.response());
										} else {
											routingContext.response().end();
										}
									});
						}
					}
				});

			});
		}
	}
}