package com.pig4cloud.pig.marketing.api.util;


import java.util.regex.Pattern;

/**
 * @author: lwh
 * @date: 2025-07-29
 * @description: 域名校验工具类
 */

public class DomainValidationUtil {
	/**
	 * 严格的域名正则表达式
	 * 规则：
	 * 1. 由字母、数字、连字符组成
	 * 2. 不能以连字符开头或结尾
	 * 3. 各部分长度不超过63个字符
	 * 4. 总长度不超过255个字符
	 * 5. 至少包含一个点（.）
	 * 6. 顶级域名至少2个字符
	 */
	private static final Pattern DOMAIN_PATTERN = Pattern.compile(
			"^(?!-)[a-zA-Z0-9-]{1,63}(?<!-)\\." +  // 主域名部分
					"+(?!-)[a-zA-Z0-9-]{1,63}(?<!-)$"     // 顶级域名部分
	);

	/**
	 * 验证域名格式是否合法
	 * @param domain 待验证的域名
	 * @return 合法返回true，否则返回false
	 */
	public static boolean isValidDomain(String domain) {
		// 空值检查
		if (domain == null || domain.trim().isEmpty()) {
			return false;
		}

		String trimDomain = domain.trim().toLowerCase();

		// 长度限制检查
		if (trimDomain.length() > 255) {
			return false;
		}

		// 正则匹配检查
		if (!DOMAIN_PATTERN.matcher(trimDomain).matches()) {
			return false;
		}

		// 检查每个部分的长度（通过点分割）
		String[] parts = trimDomain.split("\\.");
		for (String part : parts) {
			if (part.length() < 1 || part.length() > 63) {
				return false;
			}
		}

		// 检查顶级域名至少有2个字符
		String tld = parts[parts.length - 1];
		if (tld.length() < 2) {
			return false;
		}

		return true;
	}

	/**
	 * 验证域名并返回具体错误信息
	 * @param domain 待验证的域名
	 * @return 验证通过返回null，否则返回错误信息
	 */
	public static String getValidationMessage(String domain) {
		if (domain == null || domain.trim().isEmpty()) {
			return "域名不能为空";
		}

		String trimDomain = domain.trim().toLowerCase();

		if (trimDomain.length() > 255) {
			return "域名长度不能超过255个字符";
		}

		if (!DOMAIN_PATTERN.matcher(trimDomain).matches()) {
			return "域名格式不正确，只能包含字母、数字和连字符，且不能以连字符开头或结尾";
		}

		String[] parts = trimDomain.split("\\.");
		for (String part : parts) {
			if (part.isEmpty() || part.length() > 63) {
				return "域名各部分长度必须在1-63个字符之间";
			}
		}

		String tld = parts[parts.length - 1];
		if (tld.length() < 2) {
			return "顶级域名长度不能少于2个字符";
		}

		return null;
	}
}
