package com.ga.common.util;

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

import static org.assertj.core.api.Assertions.assertThat;

class MaskUtilTest {

    @Test
    @DisplayName("maskName: 길이별 분기")
    void maskName() {
        assertThat(MaskUtil.maskName("홍")).isEqualTo("홍");      // 1자: 그대로
        assertThat(MaskUtil.maskName("홍길")).isEqualTo("홍*");    // 2자: 마지막
        assertThat(MaskUtil.maskName("홍길동")).isEqualTo("홍*동"); // 3자: 가운데
        assertThat(MaskUtil.maskName("홍길동이")).isEqualTo("홍**이"); // 4자
    }

    @Test
    @DisplayName("maskPhone: 11자리 / 10자리")
    void maskPhone() {
        assertThat(MaskUtil.maskPhone("010-1234-5678")).isEqualTo("010-****-5678");
        assertThat(MaskUtil.maskPhone("01012345678")).isEqualTo("010-****-5678");
        assertThat(MaskUtil.maskPhone("031-123-4567")).isEqualTo("031-***-4567"); // 10자리
        assertThat(MaskUtil.maskPhone("02-123-4567")).isEqualTo("02-123-4567");   // 9자리는 원본
    }

    @Test
    @DisplayName("maskRrn: 13자리만 마스킹, 그 외 원본")
    void maskRrn() {
        assertThat(MaskUtil.maskRrn("880101-1234567")).isEqualTo("880101-*******");
        assertThat(MaskUtil.maskRrn("8801011234567")).isEqualTo("880101-*******");
        // 13자리가 아니면 원본 반환
        assertThat(MaskUtil.maskRrn("88010")).isEqualTo("88010");
    }

    @Test
    @DisplayName("maskAccount: 하이픈 포함 / 미포함")
    void maskAccount() {
        assertThat(MaskUtil.maskAccount("110-123-456789")).isEqualTo("110-***-******");
        // 하이픈 없는 경우, 4자리 노출 후 마스킹
        assertThat(MaskUtil.maskAccount("110123456789")).isEqualTo("1101********");
        assertThat(MaskUtil.maskAccount("123")).isEqualTo("123"); // 4자 이하는 원본
    }

    @Test
    @DisplayName("maskEmail: 첫 글자만 노출")
    void maskEmail() {
        assertThat(MaskUtil.maskEmail("aaa@bbb.com")).isEqualTo("a**@bbb.com");
        assertThat(MaskUtil.maskEmail("longusername@domain.io")).isEqualTo("l***********@domain.io");
        // @ 위치가 0 또는 1이면 마스킹 불가 → 원본
        assertThat(MaskUtil.maskEmail("@bbb.com")).isEqualTo("@bbb.com");
        assertThat(MaskUtil.maskEmail("a@bbb.com")).isEqualTo("a@bbb.com");
    }

    @Test
    @DisplayName("mask: enum 디스패치")
    void mask_enum() {
        assertThat(MaskUtil.mask("홍길동", MaskUtil.MaskType.NAME)).isEqualTo("홍*동");
        assertThat(MaskUtil.mask("010-1234-5678", MaskUtil.MaskType.PHONE)).isEqualTo("010-****-5678");
        assertThat(MaskUtil.mask("aaa@bbb.com", MaskUtil.MaskType.EMAIL)).isEqualTo("a**@bbb.com");
    }

    @Test
    @DisplayName("mask: null/blank 안전")
    void mask_nullSafe() {
        assertThat(MaskUtil.mask(null, MaskUtil.MaskType.NAME)).isNull();
        assertThat(MaskUtil.mask("", MaskUtil.MaskType.NAME)).isEmpty();
        assertThat(MaskUtil.mask("   ", MaskUtil.MaskType.NAME)).isEqualTo("   ");
    }
}
