package com.ruijc.log;

import com.aliyun.openservices.log.Client;
import com.aliyun.openservices.log.common.LogContent;
import com.aliyun.openservices.log.common.LogItem;
import com.aliyun.openservices.log.common.QueriedLog;
import com.aliyun.openservices.log.exception.LogException;
import com.aliyun.openservices.log.request.GetLogsRequest;
import com.aliyun.openservices.log.request.PutLogsRequest;
import com.aliyun.openservices.log.response.GetLogsResponse;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 使用阿里云的SLS框架的日志记录器
 *
 * @author Storezhang
 */
public class AliyunSLSLogger extends BaseLogger {

    private final String project;
    private final Client client;

    public AliyunSLSLogger(String key, String secret, String endPoint, String project, String source) {
        this.project = project;
        client = new Client(endPoint, key, secret, source, true);
    }

    @Override
    public void log(String store, String topic, String source, Object... args) {
        List<LogItem> logs = new ArrayList<LogItem>();

        LogItem item = new LogItem((int) (System.currentTimeMillis() / 1000));
        for (int i = 0; i < args.length; ++i) {
            item.PushBack(String.valueOf(args[i]), String.valueOf(args[++i]));
        }
        logs.add(item);

        PutLogsRequest req = new PutLogsRequest(project, store, topic, source, logs);
        try {
            client.PutLogs(req);
        } catch (LogException ex) {
            //Logger.log(ex);
        }
    }

    @Override
    public List<Map<String, Object>> query(String store, String topic, long start, long end, String query, long offset, int num) {
        List<Map<String, Object>> data = new ArrayList<Map<String, Object>>();

        GetLogsRequest req = new GetLogsRequest(
                project,
                store,
                (int) (start / 1000),
                (int) (end / 1000),
                topic,
                query,
                (int) offset,
                num,
                true
        );
        GetLogsResponse res;
        try {
            res = client.GetLogs(req);
        } catch (Exception e) {
            //Logger.log(e);
            return data;
        }

        List<QueriedLog> logs = res.GetLogs();
        if (null != logs && !logs.isEmpty()) {
            for (QueriedLog log : logs) {
                Map<String, Object> logData = new HashMap<String, Object>();
                logData.put("source", log.GetSource());
                List<LogContent> contents = log.GetLogItem().GetLogContents();
                if (null != contents && !contents.isEmpty()) {
                    for (LogContent content : contents) {
                        logData.put(content.GetKey(), content.GetValue());
                    }
                }
                data.add(logData);
            }
        }

        return data;
    }
}