package com.eactive.eai.custom.message;

import static org.junit.jupiter.api.Assertions.*;

import java.util.HashSet;
import java.util.Set;

import org.junit.jupiter.api.Test;

class GUIDGeneratorDJBTest {

    @Test
    void guid_길이는_40자여야_한다() {
        String guid = GUIDGeneratorDJB.getGUID("EAI");
        assertEquals(40, guid.length(), "GUID 길이는 40자: " + guid);
    }

    @Test
    void guid_시스템코드_3자로_정규화된다() {
        // 짧은 코드
        String guid1 = GUIDGeneratorDJB.getGUID("EA");
        assertEquals(40, guid1.length());

        // 긴 코드 (잘림)
        String guid2 = GUIDGeneratorDJB.getGUID("EAIFEP");
        assertEquals(40, guid2.length());

        // null
        String guid3 = GUIDGeneratorDJB.getGUID(null);
        assertEquals(40, guid3.length());
    }

    @Test
    void guid_구성_형식_검증() {
        String guid = GUIDGeneratorDJB.getGUID("EAI");
        // 일자(8) + 시간(6) + 밀리초(3) + 시스템코드(3) + 노드번호(2) + 세션ID(12) + Random(6)
        String date    = guid.substring(0, 8);
        String time    = guid.substring(8, 14);
        String millis  = guid.substring(14, 17);
        String sysCode = guid.substring(17, 20);
        String nodeNo  = guid.substring(20, 22);
        String sessId  = guid.substring(22, 34);
        String random  = guid.substring(34, 40);

        // 일자: 숫자 8자리
        assertDoesNotThrow(() -> Long.parseLong(date), "일자 부분이 숫자가 아님: " + date);
        assertTrue(date.matches("\\d{8}"), "일자 형식 오류: " + date);

        // 시간: 숫자 6자리
        assertTrue(time.matches("\\d{6}"), "시간 형식 오류: " + time);

        // 밀리초: 숫자 3자리
        assertTrue(millis.matches("\\d{3}"), "밀리초 형식 오류: " + millis);

        // 시스템코드: 3자리 영문/숫자
        assertEquals(3, sysCode.length(), "시스템코드 길이 오류: " + sysCode);

        // 노드번호: 2자리
        assertEquals(2, nodeNo.length(), "노드번호 길이 오류: " + nodeNo);

        // 세션ID: 12자리
        assertEquals(12, sessId.length(), "세션ID 길이 오류: " + sessId);

        // Random: 숫자 6자리
        assertTrue(random.matches("\\d{6}"), "Random 형식 오류: " + random);
    }

    @Test
    void guid_연속_생성시_유니크해야_한다() {
        Set<String> guids = new HashSet<>();
        int count = 1000;
        for (int i = 0; i < count; i++) {
            guids.add(GUIDGeneratorDJB.getGUID("EAI"));
        }
        assertEquals(count, guids.size(), "GUID 중복 발생");
    }

    @Test
    void guid_상수_길이값_확인() {
        assertEquals(40, GUIDGeneratorDJB.GUID_LENGTH);
    }
}
