package com.winsun.utils;

public class DesensitizationRulesUtils {

//		1、联系人及用户姓名：以*代替第二个字。
//		2、联系电话：以*号代替各脱敏字段数据的最后4字符。
//		3、日期（包括出生日期等）：以*代替月日期，如2018年1月31日，脱敏显示为2018年**月**日。
//		4、证件号码：月日以*号代替。如身份证1101081970****6593。
//		5、地址（包括证件地址、通讯地址、投递地址、装机地址等）：以*号代替各脱敏字段数据的最后4字符。如广州天河区茶山路五山花园12栋A****。
//		6、付费账号：用*号代替各脱敏字段数据的最后4字符。
//		7、鉴权信息（客户密码）：用*号代替所有字段数据。
//		8、个人生物识别信息：用*号代替所有字段数据。
	private static String replaceChar = "*********************************************************************************";

	/**
	 * 脱敏数据，输入脱敏规则
	 * type ：
	 * name 联系人及用户姓名
	 * phone 联系电话
	 * date 日期（包括出生日期等）
	 * idCard 证件号码
	 * address 地址（包括证件地址、通讯地址、投递地址、装机地址等）
	 * account 付费账号
	 * token 鉴权信息（客户密码），个人生物识别信息
	 * @param content
	 * @param type ： name联系人及用户姓名
	 * @return
	 */
	public static String desensiteData(String content, String type){
		if(content == null || content.trim() == ""){
			return "";
		}
		content = content.trim();

		switch (type) {
		case "name":
			// 联系人及用户姓名：以*代替第二个字。
			return desensitizationName(content);
		case "phone":
			// 联系电话：以*号代替各脱敏字段数据的最后4字符。
			return desensitizationPhone(content);
		case "date":
			// 日期（包括出生日期等）：以*代替月日期，如2018年1月31日，脱敏显示为2018年**月**日。
			return desensitizationDate(content);
		case "idCard":
			// 证件号码：月日以*号代替。如身份证1101081970****6593。
			return desensitizationIdCard(content);
		case "address":
			// 地址（包括证件地址、通讯地址、投递地址、装机地址等）：以*号代替各脱敏字段数据的最后4字符。如广州天河区茶山路五山花园12栋A****。
			return desensitizationAddress(content);
		case "account":
			// 付费账号：用*号代替各脱敏字段数据的最后4字符。
			return desensitizationAccount(content);
		case "token":
			// 鉴权信息（客户密码）：用*号代替所有字段数据。
			// 个人生物识别信息：用*号代替所有字段数据。
			return desensitizationToken(content);
		default:
			// 没有找到脱敏类型，不脱敏
			return content;
		}
	}

	/**
	 * 1、联系人及用户姓名：以*代替第二个字。
	 * @param content
	 * @return
	 */
	private static String desensitizationName(String content){
		int length = content.length();
		//过短直接返回
		if (length <=1) {
			return content;
		}
		if(length == 2 ){
			return content.replace(content.charAt(1), "*".charAt(0));
		}
		return content.replace(content.substring(1, length - 1), replaceChar.substring(0, length - 2));
	}

	/**
	 * 2、联系电话：以*号代替各脱敏字段数据的最后4字符。
	 * @param phone
	 * @return
	 */
	private static String desensitizationPhone(String phone){
		//重置(-)符号
		phone = phone.replaceAll("-", "");
		int length = phone.length();
		//参数长度异常，返回空
		if(length < 4){
			return "";
		}
		//手机号码
		return phone.substring(0,length - 4) + replaceChar.substring(0, 4);
	}

	/**
	 * 3、日期（包括出生日期等）：以*代替月日期，如2018年1月31日，脱敏显示为2018年**月**日。
	 * @param date
	 * @return
	 */
	public static String desensitizationDate(String date){
		int length = date.length();
		//时间格式种类较多，需分开处理
		  // 日期格式为2018年1月31日
		  if(date.indexOf("年") > -1 && date.indexOf("月") > -1 && date.indexOf("日") > -1){
		   date = date.substring(0, date.indexOf("年")+1) + "**月**日 " + date.substring(date.indexOf("日")+1);
		  }else if(date.split("/").length == 3){
		   // 日期格式为2020/08/01 或者 2020/08/01 12:12:23
		   String time = date.split(" ").length > 1 ? " " + date.split(" ")[1] : "";
		   date = date.split("/")[0] + "/**/**" + time;
		  }else if(date.split("-").length == 3){
		   // 日期格式为2020-08-01或者2020-08-01 12:12:23
		   String time = date.split(" ").length > 1 ? " " + date.split(" ")[1] : "";
		   date = date.split("-")[0] + "-**-**" + time;
		  }else{
		   if(date.length() == 8){
		    // 日期格式为20200402
		    date = date.substring(0,4)+ "****";
		   }
		  }
		return "";
	}

	/**
	 * 4、证件号码：月日以*号代替。如身份证1101081970****6593。
	 * @param idCard
	 * @return
	 */
	private static String desensitizationIdCard(String idCard) {

		int length = idCard.length();
		// 15位的身份证号码：
		// 1、1~6位为地区代码。
		// 2、7~8位为出生年份(2位)，9~10位为出生月份，11~12位为出生日期。
		// 3、第13~15位为顺序号，并能够判断性别，奇数为男，偶数为女。
		if (length == 15) {
			return idCard.substring(0, length - 7) + replaceChar.substring(0, 4) + idCard.substring(length - 3, length);
		}
		// 18位的身份证号码
		// 7~14位为出生年月日
		if (length == 18) {
			return idCard.substring(0, length - 8) + replaceChar.substring(0, 4) + idCard.substring(length - 4, length);
		}
		// 其余随便打*
		if (length > 4)
			return idCard.replace(idCard.substring(4), replaceChar.substring(0, length - 4));
		// 参数异常
		return "";
	}

	/**
	 * 5、地址（包括证件地址、通讯地址、投递地址、装机地址等）：以*号代替各脱敏字段数据的最后4字符。如广州天河区茶山路五山花园12栋A****。
	 * @param address
	 * @return
	 */
	private static String desensitizationAddress(String address){
		int length = address.length();
		if(length < 4){
			return address.charAt(0)+"**";
		}
		//处理最后有()备注的情况，过后更新



		//地址
		return address.substring(0,length - 4) + replaceChar.substring(0, 4);
	}

	/**
	 * 6、付费账号：用*号代替各脱敏字段数据的最后4字符。
	 * @param account
	 * @return
	 */
	private static String desensitizationAccount(String account){
		int length = account.length();
		if(length < 4){
			return account.charAt(0)+"**";
		}
		//手机号码
		return account.substring(0,length - 4) + replaceChar.substring(0, 4);
	}

	/**
	 * 7、鉴权信息（客户密码）：用*号代替所有字段数据。
	 * 8、个人生物识别信息：用*号代替所有字段数据。
	 * @param token
	 * @return
	 */
	private static String desensitizationToken(String token){
		int length = token.length();
		return replaceChar.substring(0, length-1);
	}




}
