package com.yanzuoguang.log;

import com.yanzuoguang.util.exception.ExceptionHelper;
import com.yanzuoguang.util.helper.DateHelper;
import com.yanzuoguang.util.helper.StringHelper;
import com.yanzuoguang.util.log.Log;
import com.yanzuoguang.util.vo.CloudConfig;
import org.springframework.stereotype.Component;

import java.util.Date;

/**
 * 写入日志
 *
 * @author 颜佐光
 */
@Component
public class AspectLogStart {

    private final CloudConfig cloudConfig;
    private final LogLocal logLocal;
    private final LogString logString;

    public AspectLogStart(CloudConfig cloudConfig, LogLocal logLocal, LogString logString) {
        this.cloudConfig = cloudConfig;
        this.logLocal = logLocal;
        this.logString = logString;
    }

    /**
     * 获取是否清空日志的标签
     *
     * @return 返回日志是否清空
     */
    public boolean requestLogInit() {
        boolean clear = Log.threadCurrent() == null;
        if (clear) {
            Log.threadBegin();
        }
        return clear;
    }

    /**
     * 记录请求日志
     *
     * @param tag         标记
     * @param url         地址
     * @param requestBody 请求内容
     * @param logFlag     是否记录日志
     */
    public LogInfoVo requestLog(Class<?> cls, String tag, String url, Object requestBody, boolean logFlag) {
        String body;
        try {
            body = logString.getBodyString(requestBody);
        } catch (Exception ex) {
            ExceptionHelper.PrintError(AspectLogStart.class, ex);
            body = StringHelper.EMPTY;
        }

        // 声明日志对象
        LogInfoVo log = new LogInfoVo();
        log.setLogId(StringHelper.getNewID());
        log.setCreateDate(DateHelper.getDateTimeString(new Date()));
        // 写入其他对象
        log.setApplicationName(this.cloudConfig.getApplicationName());
        log.setTag(tag);
        log.setUrl(url);
        log.setContent(body);
        log.setLogFlag(logFlag);
        // 开始记录到日志对象中,用于监测系统执行情况,超时时,则直接打印出日志
        this.logLocal.startLog(log);
        // 输出日志
        if (log.isLogFlag() && this.cloudConfig.isLogCommon()) {
            Log.info(cls, " %s [ %s ] request: %s", tag, url, body);
        }
        return log;
    }
}