package com.changhu.common.utils;

import cn.dev33.satoken.stp.SaLoginConfig;
import cn.dev33.satoken.stp.SaTokenInfo;
import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import com.changhu.common.db.enums.UserType;
import com.changhu.common.enums.ResultCode;
import com.changhu.common.exception.MessageException;
import lombok.extern.slf4j.Slf4j;

import java.util.Optional;

/**
 * author: luozhun
 * desc: some...
 * createTime: 2023/12/15 11:30
 */
@Slf4j
public class UserUtil {

    public static final String DEFAULT_PASSWORD = "123456";

    public static final Long ERROR_USER_ID = -1L;

    /**
     * 用户登录 保存信息
     *
     * @param userId 用户id
     */
    public static void login(Long userId) {
        StpUtil.login(userId);
    }

    /**
     * 登录并且返回SaTokenInfo
     *
     * @param userId 用户id
     * @return SaTokenInfo
     */
    public static SaTokenInfo loginAndTokenInfo(Long userId) {
        login(userId);
        return getTokenInfo();
    }

    public static SaTokenInfo loginAndTokenInfo(Long userId, UserType userType, Long unitId) {
        StpUtil.login(userId, SaLoginConfig.setExtra("userType", userType).setExtra("unitId", unitId));
        return getTokenInfo();
    }

    /**
     * 获取用户类型
     */
    public static UserType getUserType() {
        Object clientType = StpUtil.getExtra("userType");
        if (clientType instanceof String ct) {
            return UserType.valueOf(ct);
        }
        throw new MessageException("获取不到用户类型");
    }

    /**
     * 获取单位id
     */
    public static Long getUnitId() {
        return Long.parseLong(StpUtil.getExtra("unitId") + "");
    }

    /**
     * 用户登出
     */
    public static void logout() {
        StpUtil.logout();
    }

    /**
     * 获取用户id
     */
    public static Long getUserId() {
        return StpUtil.getLoginIdAsLong();
    }

    /**
     * 获取当前用户token
     *
     * @return token
     */
    public static String getToken() {
        return StpUtil.getTokenValue();
    }

    /**
     * 根据token获取id
     *
     * @param token token
     * @return id
     */
    public static Long getUserIdByToken(String token) {
        return Long.parseLong(Optional.ofNullable(StpUtil.getLoginIdByToken(token))
                .map(Object::toString)
                .orElseThrow(() -> new MessageException(ResultCode.NOT_TOKEN)));
    }

    /**
     * 获取token信息
     *
     * @return token信息
     */
    public static SaTokenInfo getTokenInfo() {
        return StpUtil.getTokenInfo();
    }

    /**
     * 加密明文密码
     *
     * @param plainTextPassWord 明文密码
     * @return 盐 + 加密后的密码
     */
    public static String passWordEncrypt(String plainTextPassWord) {
        //随机盐值
        String salt = IdUtil.simpleUUID();
        //生成密文密码
        String ciphertextPassWord = SecureUtil.md5(salt + plainTextPassWord);
        return salt + "$$" + ciphertextPassWord;
    }

    /**
     * 解密密码 校验密码是否正确
     *
     * @param plainTextPassWord  明文密码
     * @param salt               盐
     * @param ciphertextPassWord 密文密码
     * @return 比对结果
     */
    public static boolean verifyPassWord(String plainTextPassWord, String salt, String ciphertextPassWord) {
        boolean result = false;
        if (StrUtil.isAllNotEmpty(plainTextPassWord, salt, ciphertextPassWord)) {
            // 使用同样的加密算法和随机盐值生成最终加密的密码
            if (StrUtil.equals(SecureUtil.md5(salt + plainTextPassWord), ciphertextPassWord)) {
                result = true;
            }
        }
        return result;
    }
}
