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


import com.pig4cloud.pig.marketing.api.dto.app.MarketingAppsDomainDTO;
import com.pig4cloud.pig.marketing.api.dto.common.BaseDomainDTO;
import com.pig4cloud.pig.marketing.api.util.DomainValidationUtil;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;

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

public class DomainValidator implements ConstraintValidator<DomainValidation, Object> {

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

		Integer sourceType = dto.getSourceType();
		Long groupId = dto.getGroupId();
		String domain = dto.getDomain();

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

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

		// 来源类型为具体域名（2）时的校验
		if (sourceType == 2) {
//			if (groupId != null) {
//				setMessage(context, "来源为具体域名时，分组ID必须为空");
//				return false;
//			}
			if (!notEmpty(domain)) {
				setMessage(context, "来源为具体域名时，域名不能为空");
				return false;
			}
			// 校验域名格式
			if (!DomainValidationUtil.isValidDomain(domain)) {
				setMessage(context, "域名格式不合法");
				return false;
			}
			return true;
		}

		setMessage(context, "来源类型值不合法（1-来自分组，2-具体域名）");
		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();
	}
}
