package com.wb.common;

import com.ag.base.IRedisService;
import com.ag.secp.platform.spring.SpringApplicationContext;
import com.ag.util.ResourceUtil;
import com.ag.util.StrUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.wb.permission.domain.RoleByRedisService;
import com.wb.util.StringUtil;
import org.apache.commons.collections4.CollectionUtils;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;

public class KVBuffer {
	/**
	 * 键值数据缓存。
	 */
	public static ConcurrentHashMap<String, ConcurrentHashMap<Object, String>> buffer;

	/**
	 * 获取指定键值的键值项列表数组组成的字符串。
	 * @param //key 键名称。
	 * @return 键值项列表。
	 */
	public static String getList(String keyName, String tenancyId) {
		return getRedisList(keyName, tenancyId);
	}

	/**
	 * 获取指定键值的键值项列表数组组成的字符串。
	 * @param //key 键名称。
	 * @return 键值项列表。
	 */
	public static String getRedisList(String keyName, String tenancyId) {
		IRedisService service = (IRedisService)SpringApplicationContext.getBean("redisServiceImpl");
//		List<KvBean> kvBeanList = service.getAllByKey(keyName, tenancyId);
		List<KvBean> kvBeanList = service.likeByKey(keyName, null, tenancyId, 0, 1000);
		if (CollectionUtils.isEmpty(kvBeanList)) {
			return "[]";
		}
		StringBuilder buf = new StringBuilder();
		buf.append("[");
		for (int i = 0; i <kvBeanList.size() ; i++) {
			buf.append("{\"K\":");
			buf.append(StringUtil.quote(kvBeanList.get(i).getK()));
			//V=kvBeanList.get(i).getV();
			buf.append(",\"V\":");
			buf.append(StringUtil.quote(kvBeanList.get(i).getV()));
			if (i==kvBeanList.size()-1){
				buf.append("}");
			}else{
				buf.append("},");
			}
		}
		buf.append("]");
		return buf.toString();
	}

	/**
	 * 加载和初始化。
	 */
	public static synchronized void load(){
		String isLoadRedis = ResourceUtil.getString("system", "isLoadRedis");
		if ("0".equals(isLoadRedis)){
			return;
		}
		//处理redis
		loadRedis();
	}

	/**
	 * 加载和初始化。
	 */
	public static synchronized void loadRedis() {
		IRedisService service = (IRedisService)SpringApplicationContext.getBean("redisServiceImpl");
		service.redisLoad();
	}


	public static String getValue(List<KvBean> list, Object key) {
		Object value;

		if (key == null){
			return null;
		}
		if (key.equals("")){
			value=key.toString();
		}else {
			List<KvBean> voList=list.stream().filter(bean->bean.getK().equals(key)).collect(Collectors.toList());
			if (CollectionUtils.isEmpty(voList)){
				value=key;
			}else{
				value=voList.get(0).getV();
			}
		}
		if (value == null)
			return key.toString();
		else
			return value.toString();
	}

	/**
	 * 获取指定键对应的值。
	 * @param json 键值对照map。
	 * @param key 键。
	 * @return 键对应的字符串值。
	 */
	public static String getValue(Object json, Object key) {
		if (StrUtil.isEmpty(json)) {
			return null;
		}
		JSONArray array = JSONObject.parseArray(json.toString());
		Map map = new HashMap();
		for (int i=0; i<array.size(); i++){
			JSONObject jsonObject = array.getJSONObject(i);
			map.put(jsonObject.get("K"), jsonObject.get("V"));
		}
		Object value;
		if (key == null)
			return null;
		if (key instanceof Number)
			value = map.get(((Number) key).intValue());
		else
			value = map.get(key.toString());
		if (value == null)
			return key.toString();
		else
			return value.toString();
	}

	public static boolean isRole(String userName, String url) {
		RoleByRedisService service = (RoleByRedisService)SpringApplicationContext.getBean("roleByRedisService");
		return service.isRole(userName, url);
	}

	public static void putRole(String userName) {
		org.json.JSONObject json = new org.json.JSONObject();
		json.put("userId", userName);
		RoleByRedisService service = (RoleByRedisService)SpringApplicationContext.getBean("roleByRedisService");
		service.putRole(json, null, null);
	}

	public static List<KvBean> getAllByKey(String dictName, String tenancyId) {
		IRedisService service = (IRedisService)SpringApplicationContext.getBean("redisServiceImpl");
		return service.getAllByKey(dictName, tenancyId);
	}

}