package cn.reghao.devops.web.mgr.log.service;

import cn.reghao.devops.web.mgr.log.model.po.NginxLog;
import cn.reghao.jutil.jdk.converter.DateTimeConverter;
import cn.reghao.jutil.jdk.serializer.JsonConverter;
import cn.reghao.jutil.jdk.text.TextFile;
import org.springframework.stereotype.Service;

import java.text.ParseException;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.*;

/**
 * @author reghao
 * @date 2023-11-08 10:08:02
 */
@Service
public class LoggingService {
    public List getChartData() throws ParseException {
        TextFile textFile = new TextFile();
        String filePath = "nginx.log";
        List<String> list = textFile.read(filePath);

        List<NginxLog> nginxLogs = new ArrayList<>();
        for (String line : list) {
            if (!line.startsWith("{")) {
                continue;
            }

            try {
                NginxLog nginxLog = JsonConverter.jsonToObject(line, NginxLog.class);
                nginxLogs.add(nginxLog);
            } catch (Exception e) {
                // e.printStackTrace();
            }
        }

        Map<Long, Integer> map = new TreeMap<>();
        for (NginxLog nginxLog : nginxLogs) {
            String date = nginxLog.getTimeIso8601();
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss+08:00")
                    .withZone(ZoneId.of("UTC"));
            LocalDateTime localDateTime = LocalDateTime.parse(date, formatter);
            Long timestamp = localDateTime.toEpochSecond(ZoneOffset.of("+8"));
            Long key = timestamp;

            Integer count = map.get(key);
            if (count == null) {
                map.put(key, 1);
            } else {
                int count1 = map.get(key) + 1;
                map.put(key, count1);
            }
        }

        LocalDateTime localDateTime = LocalDateTime.now();
        Long baseKey = localDateTime.toEpochSecond(ZoneOffset.of("+8"));

        List<String> xList = new ArrayList<>();
        List<Integer> yList = new ArrayList<>();
        Set<Long> keys = new HashSet<>();
        for (Long key : map.keySet()) {
            if (key < baseKey) {
                //xList.add(DateTimeConverter.format(key*1000).split(" ")[1]);
                xList.add(DateTimeConverter.format(key*1000));
                yList.add(map.get(key));
                keys.add(key);
            }
        }

        keys.forEach(map::remove);
        keys.clear();
        List results = new ArrayList();
        results.add(xList.toArray());
        results.add(yList.toArray());
        return results;
    }
}
