package com.iamberry.jwt;

import com.auth0.jwt.JWTSigner;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.JWTVerifyException;
import org.apache.commons.lang3.StringUtils;

import java.io.IOException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SignatureException;
import java.util.HashMap;
import java.util.Map;

/**
 * @company	深圳爱贝源科技有限公司
 * @website www.iamberry.com
 * @author 	献
 * @tel		18271840547
 * @date	2016年11月15日
 * @explain	使用JWT完成用户Token生成
 */
public class WebJsonTokenUtil {
	
	/**
	 * 根据secretToken加密用户id、openid，生成json web token
	 * @param userid		用户id
	 * @param openId		openid
	 * @param secretToken	token，限制为8位
	 * @return				
	 * @author 献
	 * @Time   2016年11月24日
	 */
	public static String getToken(Integer userid, String openId, String secretToken) {
		JWTSigner signer = new JWTSigner(secretToken);
		// 当前时间
		long iat = System.currentTimeMillis() / 1000L;
		// 过期时间,设置为三天以后，需要重新获取token
		long exp = iat + 259200L;
		// 创建对象
		HashMap<String, Object> claims = new HashMap<String, Object>();
		claims.put("exp", exp);
		claims.put("iat", iat);
		claims.put("userid", AES.encrypt(userid.toString()));
		claims.put("WC_OPENID", openId);
		StringBuilder jsonToken = new StringBuilder(signer.sign(claims));
		return jsonToken.toString();
	}
	
	/**
	 * return:
	 * 	1:token过期，失效						<br>
	 * 	2:token正常								<br>
	 * 		可以通过get("userid")获取userid		<br>
	 * 		可以通过get("WC_OPENID")获取openid	<br>
	 * @param userToken
	 * @return
	 */
	public static Map<String, Object> verifier(String userToken, String key) {
		JWTVerifier verifier = new JWTVerifier(key);
		Map<String, Object> claims = null;
		try {
			// 解析TOKEN
			claims = verifier.verify(userToken.substring(8));
		} catch (InvalidKeyException e) {
			// 无效的键
			Map<String, Object> error = new HashMap<String, Object>();
			error.put("status", 1);
			error.put("message", "Key error");
			return error;
		} catch (NoSuchAlgorithmException e) {
			// 没有这样的算法
			Map<String, Object> error = new HashMap<String, Object>();
			error.put("status", 1);
			error.put("message", "No Such Algorithm");
			return error;
		} catch (IllegalStateException e) {
			// 非法状态
			Map<String, Object> error = new HashMap<String, Object>();
			error.put("status", 1);
			error.put("message", "Illegal State");
			return error;
		} catch (SignatureException e) {
			// 签名有误
			Map<String, Object> error = new HashMap<String, Object>();
			error.put("status", 1);
			error.put("message", "Signature State Error");
			return error;
		} catch (IOException e) {
			Map<String, Object> error = new HashMap<String, Object>();
			error.put("status", 1);
			error.put("message", "IO Exception");
			return error;
		} catch (JWTVerifyException e) {
			Map<String, Object> error = new HashMap<String, Object>();
			error.put("status", 1);
			error.put("message", e.getMessage());
			return error;
		}
		
		// 解析userid
		String temp = AES.decrypt(claims.get("userid").toString());
		if (StringUtils.isEmpty(temp)) {
			Map<String, Object> error = new HashMap<String, Object>();
			error.put("status", 1);
			error.put("message", "Data has been tampered with");
			return error;
		}
		// 重新定义ID
		claims.put("userid", temp);

		claims.put("status", 2);
		claims.put("message", "SUCCESS");
		return claims;
	}
}
