package ma.luan.yiyan.service;

import io.vertx.core.AbstractVerticle;
import io.vertx.core.CompositeFuture;
import io.vertx.core.Future;
import io.vertx.core.eventbus.Message;
import io.vertx.core.json.JsonArray;
import io.vertx.core.json.JsonObject;
import io.vertx.redis.RedisClient;
import ma.luan.yiyan.constants.Key;
import ma.luan.yiyan.util.OptionsUtil;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;


public class LogService extends AbstractVerticle {
    private RedisClient redisClient;
    private Logger log = LogManager.getLogger(this.getClass());

    @Override
    public void start(Future<Void> startFuture) {
        vertx.eventBus().consumer(Key.SET_HISTORY_TO_REDIS, this::setHistoryToRedis);
        vertx.eventBus().consumer(Key.GET_HISTORY_FROM_REDIS, this::getHistoryFromRedis);
        redisClient = RedisClient.create(vertx, OptionsUtil.getRedisOptions(config()));
        startFuture.complete();
    }

    private void setHistoryToRedis(Message<JsonObject> message) {
        redisClient.hincrby(Key.REDIS_CLICKS_HISTORY_HASH, LocalDate.now().toString(), 1, res -> {
            if (res.failed()) {
                log.error("Fail to get data from Redis", res.cause());
            }
        });
        redisClient.hincrby(Key.REDIS_CLICKS_TOTAL_HASH, "total", 1, res -> {
            if (res.failed()) {
                log.error("Fail to get data from Redis", res.cause());
            }
        });
    }

    private void getHistoryFromRedis(Message<JsonObject> message) {
        Future<String> total = Future.future(f -> redisClient.hget(Key.REDIS_CLICKS_TOTAL_HASH, "total", f));
        // 7天的历史点击量
        LocalDate localDate = LocalDate.now();
        List<String> keys = new ArrayList<>();
        for (int i = 0; i < 7; i++) {
            keys.add(localDate.toString());
            localDate = localDate.minusDays(1);
        }
        Future<JsonArray> history = Future.future(f -> redisClient.hmget(Key.REDIS_CLICKS_HISTORY_HASH, keys, f));
        CompositeFuture.all(Arrays.asList(total, history)).setHandler(v -> {
            if (v.succeeded()) {
                JsonObject result = new JsonObject();
                result.put("总点击量", total.result());
                result.put("最近七天点击量", history.result());
                message.reply(result);
            } else {
                log.error("日志获取异常", v.cause());
                message.fail(500, v.cause().getMessage());
            }
        });
    }


}