package com.manage.service.cache;

import com.manage.vo.Power_UserVo;

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

public class CacheManager {
    private static HashMap cacheMap = new HashMap();
    //private static HashMap cacheExceptionMap = new HashMap();
    //private static HashMap<String,HashMap<String,Integer>> loginUserCacheMap = new HashMap();
    /*//无异常数量
    private static Integer noExcCount = 0;
    //异常数量
    private static Integer excCount = 0;*/

    //添加用户登录缓存
    public  static void addloginUserCount(String date,String userName){
        //取出当天数据
        /*HashMap<String,Integer> map = loginUserCacheMap.get(date);
        if(null == map){
            map = new HashMap<>();
            //首次登录
            map.put(userName,1);
        }else{
            //取出该用户当天登录数
            Integer count = (Integer)map.get(userName);
            if(null == count){
                count = 0;
            }
            //加1
            count++;
            //重置
            map.put(userName,count);
        }
        //重置
        loginUserCacheMap.put(date,map);*/
    }

    //获取当天用户集合
    public  static HashMap getCurrentDayCount(String date){
        //取出当天数据
       /* HashMap map = loginUserCacheMap.get(date);
        return map;*/
       return null;
    }

    //添加异常数量
    public synchronized static void addExcCount(String type){
        if("noExc".equals(type)){
            /*noExcCount++;
            cacheExceptionMap.put(type,noExcCount);*/
        }
        if("exc".equals(type)){
            /*excCount++;
            cacheExceptionMap.put(type,excCount);*/
        }
    }

    //取异常数量
    public static Integer getExcCount(String type){
        return 0;
        //return (Integer)cacheExceptionMap.get(type);
    }

    private CacheManager() {
        super();
    }

    private static Cache getCache(String key) {
        return (Cache) cacheMap.get(key);
    }

    private static boolean hasCache(String key) {
        return cacheMap.containsKey(key);
    }

    public static void clearAll() {
        cacheMap.clear();
    }

    public static void clearAll(String type) {
        Iterator i = cacheMap.entrySet().iterator();
        String key;
        ArrayList<String> arr = new ArrayList<String>();
        try {
            while (i.hasNext()) {
                Map.Entry entry = (Map.Entry) i.next();
                key = (String) entry.getKey();
                if (key.startsWith(type)) {
                    arr.add(key);
                }
            }
            for (int k = 0; k < arr.size(); k++) {
                clearOnly(arr.get(k));
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }

    public static void clearOnly(String key) {
        cacheMap.remove(key);
    }

    public static void putCache(String key, Cache obj) {
        cacheMap.put(key, obj);
    }

    public static Cache getCacheInfo(String key) {
        if (hasCache(key)) {
            Cache cache = getCache(key);
            if (cacheExpired(cache)) {
                cache.setExpired(true);
            }
            return cache;
        }else {
            return null;
        }
    }

    public static boolean cacheExpired(Cache cache) {
        if (null == cache) {
            return false;
        }
        long nowDt = System.currentTimeMillis();
        long cacheDt = cache.getTimeOut();
        if (cacheDt <= 0||cacheDt>nowDt) {
            return false;
        } else {
            return true;
        }
    }

    //根据用户信息删除缓存
    public static void removeCacheByObject(Power_UserVo obj) {
        ArrayList<String> arr = new ArrayList<String>();
        try {
            Iterator i = cacheMap.entrySet().iterator();
            while (i.hasNext()) {
                Map.Entry entry = (Map.Entry) i.next();
                Cache cache = CacheManager.getCacheInfo((String)entry.getKey());
                Power_UserVo o = (Power_UserVo)cache.getValue();
                if (obj.getUserName().equals(o.getUserName())) {
                    arr.add((String)entry.getKey());
                }
            }
            if(null != arr && !arr.isEmpty()){
                for (int k = 0; k < arr.size(); k++) {
                    clearOnly(arr.get(k));
                }
            }
        } catch (Exception ex) {}
    }
}