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

import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull;

import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

/**
 * eapim-admin {@link MaskingUtils}가 보안아키텍처 표준 규칙(elink-online-core)으로
 * 위임되어 동작하는지 검증한다.
 */
class MaskingUtilsTest {

    // --- 이메일 (maskEmailId) ---

    @Test
    @DisplayName("이메일 — 아이디 앞2·뒤2 마스킹")
    void maskEmailId_normal() {
        assertEquals("**st1**@test.com", MaskingUtils.maskEmailId("test123@test.com"));
    }

    @Test
    @DisplayName("이메일 — 아이디 4자: 전체 마스킹")
    void maskEmailId_fourChars() {
        assertEquals("****@test.com", MaskingUtils.maskEmailId("test@test.com"));
    }

    @Test
    @DisplayName("이메일 — 아이디 1자: 전체 마스킹")
    void maskEmailId_oneChar() {
        assertEquals("*@123.com", MaskingUtils.maskEmailId("1@123.com"));
    }

    @Test
    @DisplayName("이메일 — @ 없으면 원본 / null·빈문자 방어")
    void maskEmailId_invalidAndNull() {
        assertEquals("notanemail", MaskingUtils.maskEmailId("notanemail"));
        assertNull(MaskingUtils.maskEmailId(null));
        assertEquals("", MaskingUtils.maskEmailId(""));
    }

    // --- 이름 (maskName) ---

    @Test
    @DisplayName("이름 — 2자: 뒤 1자리")
    void maskName_2chars() {
        assertEquals("가*", MaskingUtils.maskName("가나"));
    }

    @Test
    @DisplayName("이름 — 3자: 가운데 1자리")
    void maskName_3chars() {
        assertEquals("가*다", MaskingUtils.maskName("가나다"));
    }

    @Test
    @DisplayName("이름 — 4자: 앞뒤 제외 가운데 전체")
    void maskName_4chars() {
        assertEquals("가**라", MaskingUtils.maskName("가나다라"));
    }

    @Test
    @DisplayName("이름 — 5자: 앞뒤 제외 가운데 전체")
    void maskName_5chars() {
        assertEquals("가***마", MaskingUtils.maskName("가나다라마"));
    }

    @Test
    @DisplayName("이름 — 1자/null/빈문자 방어")
    void maskName_oneAndNull() {
        assertEquals("가", MaskingUtils.maskName("가"));
        assertNull(MaskingUtils.maskName(null));
        assertEquals("", MaskingUtils.maskName(""));
    }

    // --- 전화/휴대폰/Fax (maskPhoneNumber) ---

    @Test
    @DisplayName("전화 — 2·3번째 세그먼트 각 뒤 2자리")
    void maskPhoneNumber_normal() {
        assertEquals("010-12**-12**", MaskingUtils.maskPhoneNumber("010-1234-1234"));
        assertEquals("064-12**-56**", MaskingUtils.maskPhoneNumber("064-1234-5678"));
    }

    @Test
    @DisplayName("전화 — 하이픈 없는 11자리")
    void maskPhoneNumber_noHyphen() {
        assertEquals("01012**56**", MaskingUtils.maskPhoneNumber("01012345678"));
    }

    @Test
    @DisplayName("전화 — null/빈문자 방어")
    void maskPhoneNumber_null() {
        assertNull(MaskingUtils.maskPhoneNumber(null));
        assertEquals("", MaskingUtils.maskPhoneNumber(""));
    }

    // --- IP (maskIpAddress) ---

    @Test
    @DisplayName("IPv4 — 3번째 옥텟 마스킹")
    void maskIpAddress_ipv4() {
        assertEquals("172.0.***.1", MaskingUtils.maskIpAddress("172.0.0.1"));
        assertEquals("192.168.***.1", MaskingUtils.maskIpAddress("192.168.100.1"));
    }

    @Test
    @DisplayName("IPv6 — 마지막 그룹 마스킹")
    void maskIpAddress_ipv6() {
        assertEquals(
            "AAAA:BBBB:CCCC:DDDD:EEEE:FFFF:0000:****",
            MaskingUtils.maskIpAddress("AAAA:BBBB:CCCC:DDDD:EEEE:FFFF:0000:1111"));
    }

    @Test
    @DisplayName("IP — 쉼표 구분 다중 IPv4")
    void maskIpAddress_multiple() {
        assertEquals("192.168.***.1,10.0.***.2", MaskingUtils.maskIpAddress("192.168.100.1,10.0.0.2"));
    }

    @Test
    @DisplayName("IP — null/빈문자 방어")
    void maskIpAddress_null() {
        assertNull(MaskingUtils.maskIpAddress(null));
        assertEquals("", MaskingUtils.maskIpAddress(""));
    }
}
