package com.yanzuoguang.log;

import com.yanzuoguang.util.cache.MemoryCache;
import com.yanzuoguang.util.helper.DateHelper;
import com.yanzuoguang.util.helper.StringHelper;
import org.springframework.stereotype.Component;

/**
 * 日志时间
 *
 * @author 颜佐光
 */
@Component
public class LogCountTime {

    private static final String URL_PARA_START = "?";

    /**
     * 今日缓存,超过时间会自动清空
     */
    private final MemoryCache<LogUrlCountVo> todayMemoryCache = new MemoryCache<>();
    /**
     * 今日日期
     */
    private String today;
    /**
     * 今日时间
     */
    private String todayTime;

    /**
     * 获取日志结果
     *
     * @return 今日日志结果
     */
    public LogCountResult getTodayResult() {
        return new LogCountResult(todayTime, todayMemoryCache.getValues());
    }

    private void initToday() {
        String today = DateHelper.getToday();
        if (!StringHelper.compare(this.today, today)) {
            synchronized (todayMemoryCache) {
                if (!StringHelper.compare(this.today, today)) {
                    todayMemoryCache.clear();
                    this.today = today;
                    this.todayTime = DateHelper.getNow();
                }
            }
        }

    }

    /**
     * 获取缓存对象
     *
     * @param urlFrom 地址
     * @return 缓存对象
     */
    private LogUrlCountVo getCount(String urlFrom) {
        // 初始化日期
        initToday();
        String key;
        if (urlFrom.contains(URL_PARA_START)) {
            key = urlFrom.substring(0, urlFrom.indexOf(URL_PARA_START));
        }
        else{
            key = urlFrom;
        }
        // 缓存中获取对象
        LogUrlCountVo ret = todayMemoryCache.get(key);
        if (ret != null) {
            return ret;
        }
        // 缓存中不存在则创建对象
        synchronized (todayMemoryCache) {
            ret = todayMemoryCache.get(key);
            if (ret != null) {
                return ret;
            }
            ret = new LogUrlCountVo(key);
            todayMemoryCache.put(key, ret);
            return ret;
        }
    }

    /**
     * 开始记录日志
     *
     * @param url 请求地址
     */
    public void start(String url) {
        LogUrlCountVo count = getCount(url);
        count.addStart();
    }

    /**
     * 结束
     *
     * @param url     请求地址
     * @param time    执行时间
     * @param isError 是否错误
     */
    public void finish(String url, long time, boolean isError) {
        LogUrlCountVo count = getCount(url);
        count.addFinish(time, isError);
    }
}