package dev.lions.unionflow.client.validation;

import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;
import java.util.regex.Pattern;

public class MemberNumberValidator implements ConstraintValidator<ValidMemberNumber, String> {
    
    // Pattern pour numéro de membre: M + année + numéro séquentiel
    private static final Pattern MEMBER_NUMBER_PATTERN = Pattern.compile("^M[0-9]{4}[0-9]{3,6}$");
    
    @Override
    public void initialize(ValidMemberNumber constraintAnnotation) {
        // Initialisation si nécessaire
    }
    
    @Override
    public boolean isValid(String memberNumber, ConstraintValidatorContext context) {
        // Null ou vide = invalide pour un numéro de membre
        if (memberNumber == null || memberNumber.trim().isEmpty()) {
            return false;
        }
        
        // Vérifier que le préfixe est en majuscule (sensible à la casse)
        String trimmed = memberNumber.trim();
        if (trimmed.length() == 0 || trimmed.charAt(0) != 'M') {
            return false;
        }
        
        // Nettoyer le numéro (supprimer espaces et convertir en majuscule)
        String cleanNumber = trimmed.toUpperCase();
        
        // Vérifier le pattern
        if (!MEMBER_NUMBER_PATTERN.matcher(cleanNumber).matches()) {
            return false;
        }
        
        // Vérifier que l'année est raisonnable (entre 2020 et année actuelle + 1)
        try {
            String yearStr = cleanNumber.substring(1, 5);
            int year = Integer.parseInt(yearStr);
            int currentYear = java.time.Year.now().getValue();
            
            if (year < 2020 || year > currentYear + 1) {
                // Ajouter un message d'erreur seulement si context n'est pas null
                if (context != null) {
                    context.disableDefaultConstraintViolation();
                    context.buildConstraintViolationWithTemplate(
                        "L'année dans le numéro de membre doit être entre 2020 et " + (currentYear + 1)
                    ).addConstraintViolation();
                }
                return false;
            }
        } catch (NumberFormatException e) {
            return false;
        }
        
        return true;
    }
}
