
package org.tio.sitexxx.service.utils;

import cn.hutool.core.util.StrUtil;
import org.tio.sitexxx.service.service.base.SensitiveWordsService;
import org.tio.http.common.HttpRequest;
import org.tio.sitexxx.service.vo.Const;
import org.tio.utils.json.Json;
import org.tio.utils.resp.Resp;

/**
 * @author tanyaowu
 */
public class CommonUtils {
	/**
	 * 
	 * @param name
	 * @param prefix
	 * @return
	 */
	public static Resp checkGroupName(String name, String prefix) {
		if (StrUtil.isBlank(name)) {
			return Resp.fail(prefix + "不允许为空");
		}
		if (name.length() > 32) {
			return Resp.fail(prefix + "太长了");
		}

		if (name.contains("@") || name.contains("＠")) {
			return Resp.fail(prefix + "不能包含 \"@\" 字符");
		}

		if (name.contains(" ") || name.contains("　")) {
			return Resp.fail(prefix + "不能包含空格");
		}

		if (StrUtil.containsAny(name, Const.SPECIAL_CHARACTER)) {
			return Resp.fail(prefix + "不能包含如下特殊字符：" + Json.toJson(Const.SPECIAL_CHARACTER));
		}

		if (SensitiveWordsService.isMatch(name)) {
			return Resp.fail(prefix + "存在敏感信息，请重新输入");
		}

		return Resp.ok();
	}

	private static final String UNKNOWN = "unknown";
	private static final String SEPARATOR = ",";
	private static final String HEADER_X_FORWARDED_FOR = "x-forwarded-for";
	private static final String HEADER_PROXY_CLIENT_IP = "Proxy-Client-IP";
	private static final String HEADER_WL_PROXY_CLIENT_IP = "WL-Proxy-Client-IP";

	public static String getRealIpAddress(HttpRequest serverHttpRequest) {
		//建应用(100%)->拉人(宣传,推广)(10%)->运行(1%)

		String ipAddress;
		try {
			// 1.根据常见的代理服务器转发的请求ip存放协议，从请求头获取原始请求ip。值类似于203.98.182.163, 203.98.182.163
			ipAddress = serverHttpRequest.getHeaders().get(HEADER_X_FORWARDED_FOR);
			if (StrUtil.isBlank(ipAddress) ||UNKNOWN.equalsIgnoreCase(ipAddress)) {
				ipAddress = serverHttpRequest.getHeaders().get(HEADER_PROXY_CLIENT_IP);
			}
			if (StrUtil.isBlank(ipAddress) || UNKNOWN.equalsIgnoreCase(ipAddress)) {
				ipAddress = serverHttpRequest.getHeaders().get(HEADER_WL_PROXY_CLIENT_IP);
			}

			// 2.如果没有转发的ip，则取当前通信的请求端的ip
			if (StrUtil.isBlank(ipAddress) ||UNKNOWN.equalsIgnoreCase(ipAddress)) {
				ipAddress = serverHttpRequest.getClientIp();
				// 如果是127.0.0.1，则取本地真实ip
			}
			// 对于通过多个代理的情况，第一个IP为客户端真实IP,多个IP按照','分割
			// "***.***.***.***"
			if (ipAddress != null) {
				ipAddress = ipAddress.split(SEPARATOR)[0].trim();
			}
		} catch (Exception e) {
			ipAddress = "";
		}
		return ipAddress == null ? "" : ipAddress;
	}

	// 姓名正则：匹配第一个字符后的所有字符并替换为*
	public static String maskNameRegex(String name) {
		if (name == null || name.length() <= 1) return name;
		// 这里的逻辑稍微复杂，因为要保留最后一个字，纯正则较难完美处理所有情况
		// 推荐还是使用上面的 substring 方法，正则更适合手机号等固定格式
		return name.replaceAll("(?<=^.).(?=.$)", "*");
	}

	// 身份证正则 (18位)
	public static String maskIdCardRegex(String idCard) {
		if (idCard == null || idCard.length() != 18) return idCard;
		// 替换第7位到第14位
		return idCard.replaceAll("(\\d{6})\\d{8}(\\d{4})", "$1********$2");
	}
}
