package com.zioinfo.hrm.ai.learning;

/**
 * 학습 저장소(DuckDB) 적재 전 PII·자격증명 마스킹. [GUARDiA-HRM]
 *
 * <p>인사(HR) 데이터 특성상 민감정보가 많다 — 피드백/추론 로그에 사용자가 입력한 질문·답변·교정문이 그대로
 * 남지 않도록 이메일·전화·주민번호·카드번호·IP 를 마스킹한다. 원문 복원 불가(단방향). 로컬 DuckDB·중앙 rag
 * 전달 양쪽에 동일 적용.
 */
public final class PiiMasker {

    private PiiMasker() {
    }

    private static final java.util.regex.Pattern EMAIL =
            java.util.regex.Pattern.compile("[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}");
    private static final java.util.regex.Pattern RRN =
            java.util.regex.Pattern.compile("\\b\\d{6}[-\\s]?\\d{7}\\b");
    private static final java.util.regex.Pattern CARD =
            java.util.regex.Pattern.compile("\\b(?:\\d[ -]?){13,16}\\b");
    private static final java.util.regex.Pattern PHONE =
            java.util.regex.Pattern.compile("\\b0\\d{1,2}[-\\s]?\\d{3,4}[-\\s]?\\d{4}\\b");
    private static final java.util.regex.Pattern IPV4 =
            java.util.regex.Pattern.compile("\\b(?:\\d{1,3}\\.){3}\\d{1,3}\\b");

    /** 텍스트의 PII 를 마스킹한다. null 은 null 로 통과. */
    public static String mask(String s) {
        if (s == null || s.isBlank()) {
            return s;
        }
        String out = s;
        out = RRN.matcher(out).replaceAll("######-#######");
        out = CARD.matcher(out).replaceAll("****-****-****-****");
        out = EMAIL.matcher(out).replaceAll("***@***");
        out = PHONE.matcher(out).replaceAll("***-****-****");
        out = IPV4.matcher(out).replaceAll("***.***.***.***");
        return out;
    }

    /** 사용자 식별자 마스킹(앞 2글자만 노출). */
    public static String maskUser(String user) {
        if (user == null || user.isBlank()) {
            return "anon";
        }
        String u = user.trim();
        if (u.length() <= 2) {
            return u.charAt(0) + "*";
        }
        return u.substring(0, 2) + "*".repeat(Math.min(6, u.length() - 2));
    }
}
