package com.eactive.eai.rms.onl.apim.masking;

import com.eactive.eai.rms.common.util.StringUtils;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class MaskingUtils {
    /**
     * 이메일 주소의 ID 부분을 마스킹 처리
     * 예: eactive@gmail.com => eact***@gmail.com
     */
    public static String maskEmailId(String email) {
        if (email == null || email.isEmpty() || !email.contains("@")) {
            return email;
        }

        String[] parts = email.split("@");
        String id = parts[0];
        String domain = parts[1];

        if (id.length() <= 3) {
            return "***" + "@" + domain;
        }

        String maskedId = id.substring(0, id.length() - 3) + "***";
        return maskedId + "@" + domain;
    }

    /**
     * 이름의 마지막 글자를 마스킹 처리
     */
    public static String maskName(String name) {
        if (name == null || name.isEmpty() || name.length() < 2) {
            return name;
        }

        return name.substring(0, name.length() - 1) + "*";
    }

    /**
     * 전화번호 마스킹 처리
     * 예: 010-1234-5678 => 010-****-5678
     */
    public static String maskPhoneNumber(String phoneNumber) {
        if (phoneNumber == null || phoneNumber.isEmpty()) {
            return phoneNumber;
        }

        String[] parts = phoneNumber.split("-");
        if (parts.length != 3) {
            return phoneNumber;
        }

        return parts[0] + "-****-" + parts[2];
    }

    /**
     * IP 주소 마스킹 처리
     * 예: 192.168.1.1 => 192.168.*.*
     */
    public static String maskIpAddress(String ipAddresses) {
        if (StringUtils.isBlank(ipAddresses)) {
            return ipAddresses;
        }

        String[] ips = ipAddresses.split(",");
        List<String> maskedIps = Arrays.stream(ips)
                .map(ip -> {
                    String[] parts = ip.trim().split("\\.");
                    if (parts.length == 4) {
                        // 세 번째 octet을 ***로 마스킹
                        parts[2] = "***";
                        return String.join(".", parts);
                    }
                    return ip; // 유효하지 않은 IP 형식은 그대로 반환
                })
                .collect(Collectors.toList());

        return String.join(",", maskedIps);
    }
}
