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


import com.pig4cloud.pig.common.core.util.ip.IPUtils;
import com.pig4cloud.pig.marketing.api.dto.common.BaseIpDTO;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;

/**
 * @author: lwh
 * @date: 2025-07-29
 * @description: IP校验器
 */

public class IPValidator implements ConstraintValidator<IPValidation, Object> {

	@Override
	public boolean isValid(Object value, ConstraintValidatorContext context) {
		if (!(value instanceof BaseIpDTO dto)) {
			return true;
		}

		Integer sourceType = dto.getSourceType();
		Long groupId = dto.getGroupId();
		Integer ipMode = dto.getIpMode();
		String startIp = dto.getStartIp();
		String endIp = dto.getEndIp();

		if (sourceType == null){
			setMessage(context, "来源类型不能为空");
			return false;
		}

		// 来源类型为分组（1）时的校验
		if (sourceType == 1) {
			if (groupId == null) {
				setMessage(context, "来源为分组时，分组ID不能为空");
				return false;
			}
//			// 分组模式下不能有IP相关字段
//			if (ipMode != null || notEmpty(startIp) || notEmpty(endIp)) {
//				setMessage(context, "来源为分组时，不能填写IP模式、IP地址");
//				return false;
//			}
			return true;
		}

		// 来源类型为具体IP（2）时的校验
		if (sourceType == 2) {
//			// 具体IP模式下不能有groupId
//			if (groupId != null) {
//				setMessage(context, "来源为具体IP时，分组ID必须为空");
//				return false;
//			}
			// 必须指定IP模式
			if (ipMode == null) {
				setMessage(context, "来源为具体IP时，IP模式不能为空");
				return false;
			}

			// 单IP模式（ipMode=1）
			if (ipMode == 1) {
				if (!notEmpty(startIp)) {
					setMessage(context, "单IP模式下，startIp不能为空");
					return false;
				}
//				if (notEmpty(endIp)) {
//					setMessage(context, "单IP模式下，endIp必须为空");
//					return false;
//				}
				// 校验IP格式
				if (!IPUtils.isValidIp(startIp)) {
					setMessage(context, "IP格式不合法（IPv4）");
					return false;
				}
				return true;
			}

			// IP段模式（ipMode=2）
			if (ipMode == 2) {
				if (!notEmpty(startIp) || !notEmpty(endIp)) {
					setMessage(context, "IP段模式下，startIp和endIp都不能为空");
					return false;
				}
				// 校验IP格式
				if (!IPUtils.isValidIp(startIp)) {
					setMessage(context, "startIp格式不合法（IPv4）");
					return false;
				}
				if (!IPUtils.isValidIp(endIp)) {
					setMessage(context, "endIp格式不合法（IPv4）");
					return false;
				}
				// 校验endIp > startIp
				if (!IPUtils.isEndIpGreater(startIp, endIp)) {
					setMessage(context, "IP段模式下，endIp必须大于startIp");
					return false;
				}
				return true;
			}

			setMessage(context, "IP模式值不合法（1-单IP，2-IP段）");
			return false;
		}

		setMessage(context, "来源类型值不合法（1-来自分组，2-具体IP）");
		return false;
	}

	// 工具方法：判断字符串非空
	private boolean notEmpty(String str) {
		return str != null && !str.trim().isEmpty();
	}

	// 自定义错误信息
	private void setMessage(ConstraintValidatorContext context, String message) {
		context.disableDefaultConstraintViolation();
		context.buildConstraintViolationWithTemplate(message).addConstraintViolation();
	}
}
