package com.app.framework.core.api.service;

import cn.hutool.core.date.DateUtil;
import com.app.framework.core.api.request.ApiLoginUser;
import com.app.framework.core.support.enums.common.PlatformEnum;
import com.app.framework.core.support.view.form.AjaxResult;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;

import java.util.Date;
import java.util.Map;

/**
 * Api接口
 * 校验验令牌
 */
public interface ApiService {

    /**
     * 根据平台生成token
     *
     * @param platform  平台类型{@link PlatformEnum}
     * @param expires   token有效时间（单位小时,0或null则永久有效）
     * @param loginUser 登录用户信息
     * @return token
     */
    default String createToken(String platform, Integer expires, ApiLoginUser loginUser) {
        JWTCreator.Builder builder = JWT.create();
        builder.withClaim("platform", platform);
        builder.withClaim("userId", loginUser.getId());
        if (expires != null && expires > 0)
            builder.withExpiresAt(DateUtil.offsetHour(new Date(), expires));//设置过期时间
        return builder.sign(Algorithm.HMAC256("ApiUserToken"));//设置签名 密钥
    }

    /**
     * 校验token并返回登录用户信息
     *
     * @param platform 平台类型{@link PlatformEnum}
     * @param token    用户token
     */
    default AjaxResult<ApiLoginUser> checkToken(String platform, String token) {
        try {
            //创建验证对象,这里使用的加密算法和密钥必须与生成TOKEN时的相同否则无法验证
            JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256("ApiUserToken")).build();
            //验证JWT
            DecodedJWT decodedJWT = jwtVerifier.verify(token);

            Map<String, Claim> claims = decodedJWT.getClaims();
            Long userId = claims.get("userId").asLong();

            return AjaxResult.wrapData(ApiLoginUser.userId(userId));
        } catch (Exception e) {
            return AjaxResult.wrapError("身份验证失败");
        }
    }

    /**
     * 移除用户信息
     *
     * @param platform  平台类型{@link PlatformEnum}
     * @param loginUser 登录用户信息
     */
    default AjaxResult removeToken(String platform, ApiLoginUser loginUser) {
        return AjaxResult.wrap(false);
    }
}
