package com.tzy.common.utils;

import com.alibaba.fastjson.JSON;
import com.tzy.common.config.CommonConfig;
import com.tzy.common.dto.UserInfo;
import com.tzy.common.exception.ServiceException;
import lombok.extern.slf4j.Slf4j;

import java.nio.charset.StandardCharsets;

/**
 * @author by po'yi
 * @Classname UserUtils
 * @Description 用户工具类
 * @Date 2022/8/30 10:56
 */
@Slf4j
public class UserUtils {

	public static void main(String[] args) {
		//List<String> list = new ArrayList<>();
		//list.add("1");
		//list.add("2");
		//list.add("3");
		//list.add("11");
		//list.add("12");
		//list.add("-1");
		//list.add("-11");
		//List<String> list1 = list.stream().sorted(Comparator.comparing(s -> new BigInteger(s).abs())).limit(3).collect(Collectors.toList());
		//System.out.println(list1);
		//System.out.println(DigestUtils.md5Hex("123"));

		String jstr="Bearer eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiIxNTciLCJ1bmlvbmlkIjoiIiwidHlwZSI6IlRISVJEX0FQSyIsImV4cCI6MTY5MzA0MTM0NSwiaWF0IjoxNjkwNDQ5MzQ1LCJ1c2VybmFtZSI6IjEzMDcxMDA1MTAzIn0.ENNMo5YPTjBPVk07sLBQal6Lp92fWBtJeHOsZpsjN5aMYRxBQmTioOqiWyX8-wEPG9k9ezkq2B9ZRwnoOVh2nQ";
		//System.out.println(new String( Base64Util.decode(jstr.split(" ")[1].split("\\.")[1])));
		//String userStr = new String(Base64Util.decode(jstr.split(" ")[1].split("\\.")[1]));
		//JSONObject userJson = JSON.parseObject(userStr);
		//System.out.println(userJson.getInteger("sub"));
		//List<Integer> list2 = new ArrayList<>();
		//list2.add(1);
		//list2.add(200);
		//list2.add(123);
		//list2.add(500);
		//Integer s=1;
		//Integer s2=123;
		//Integer s3=200;
		//System.out.println(list2.contains(s));
		//System.out.println(list2.contains(s2));
		//System.out.println(list2.contains(s3));
		//System.out.println("Math.ceil(3.2) = " + Math.ceil(3.2));  // 输出 4.0

	}

	/**
	 * 查询请求头中用户部分信息
	 * 该方法不接受任何参数，通过读取请求头中的"X-USER-BASE64"字段，获取用户信息的Base64编码字符串。
	 * 对该字符串进行解码，并尝试将其转换为UserInfo对象返回。
	 * 如果无法解码或转换失败，则返回null。
	 *
	 * @return UserInfo 如果成功解析用户信息，则返回UserInfo对象；否则返回null。
	 */
	public static UserInfo getSimpleUserInfo() {
		String userInfoStr = ServletUtils.getRequest().getHeader("X-USER-BASE64");
		log.debug("请求用户信息base64:{}", userInfoStr);
		if (StringUtils.isEmpty(userInfoStr)) {
			return null;
		}
		try {
			String user = new String(Base64Util.decodeV2(userInfoStr));
			log.debug("请求用户:{}", user);
			return JSON.parseObject(user, UserInfo.class);
		} catch (IllegalArgumentException | IllegalStateException e) {
			log.error("请求用户信息base64解析异常:{}", userInfoStr, e);
			throw new ServiceException("用户信息格式错误!");
		} catch (Exception e) {
			log.error("请求用户信息base64解析异常: {}", userInfoStr, e);
			throw new ServiceException("系统异常!");
		}
	}

	/**
	 * 仅用于开发环境获取简化的用户信息。
	 * @param isNeedLogin 是否需要登录。如果为true，则必须提供有效的用户信息；如果为false，则可以返回null或默认用户信息。
	 * @return UserInfo 对象，包含用户信息。如果环境配置为生产环境且需要登录，但未提供用户信息，则抛出用户不存在异常。
	 * 在开发环境中，如果未提供用户信息且需要登录，则返回默认用户信息；如果不需要登录，则返回null。
	 * 解析用户信息时，如果遇到任何异常，都将抛出相应错误。
	 */
	public static UserInfo getSimpleUserInfo(boolean isNeedLogin) {
		String userInfoStr = ServletUtils.getRequest().getHeader("X-USER-BASE64");
		log.debug("请求用户信息base64:{}", userInfoStr);
		if (StringUtils.isEmpty(userInfoStr)) {
			if (CommonConfig.isProdEnv() && isNeedLogin) {
				throw new ServiceException(500, "用户不存在!");
			}
			if (CommonConfig.isDevEnv() && isNeedLogin) {
				return getDefaultUserInfo();
			}
			return null;
		}

		try {
			String user = new String(Base64Util.decodeV2(userInfoStr),StandardCharsets.UTF_8);
			log.debug("请求用户:{}", user);
			return JSON.parseObject(user, UserInfo.class);
		} catch (IllegalArgumentException | IllegalStateException e) {
			log.error("请求用户信息base64解析异常:{}", userInfoStr, e);
			throw new ServiceException("用户信息格式错误!");
		} catch (Exception e) {
			log.error("未知异常: {}", userInfoStr, e);
			throw new ServiceException("系统异常!");
		}
	}

	private static UserInfo getDefaultUserInfo() {
		//必须登陆
		UserInfo userInfo = new UserInfo();
		userInfo.setNickname("yu");
		userInfo.setMerchantName("HStest105");
		userInfo.setRoleCode("shipping");
		userInfo.setRoleCode("admin");
		userInfo.setMerchantId(105);
		userInfo.setId(26961);
		//userInfo.setMerchantId(105);
		userInfo.setMerchantId(181);
		//userInfo.setMerchantId(13);
		//userInfo.setId(15160);
		//userInfo.setMerchantId(181);
		//userInfo.setId(15167);
		//userInfo.setId(15261);
		//userInfo.setId(2442);
		//userInfo.setId(15400);
		userInfo.setId(2442);
		return userInfo;
	}

	/**
	 * 用户昵称脱敏
	 * @param input
	 * @return
	 */
	public static String hideUserPhone(String input) {
		if (StringUtils.isEmpty(input)) {
			return "匿名用户";
		}
		// 如果是手机号 (11 位数字)
		if (input.matches("\\d{11}")) {
			return input.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
		}

		// 如果是邮箱，格式通常为 xxx@xxx.com
		if (input.matches("^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$")) {
			// 只脱敏@前面的部分，保留前三个字符
			return input.replaceAll("^(\\w{3})\\w+(@.*$)", "$1****$2");
		}

		// 如果是纯数字（不包含其他字符），并且长度大于等于 4
		if (input.matches("\\d+") && input.length() >= 4) {
			// 保留前3位，后4位，其他的替换为****
			return input.replaceAll("(\\d{3})\\d+(\\d{4})", "$1****$2");
		}
		return input;
	}
}