/* 문자열.codePointAt(index) */
const str = "ABCDE🎄🎁";

// 1. 일반 문자 확인
const index = 1; // 인덱스 1에 위치한 문자는 "B" (문자열 인덱스는 0부터 시작)
const resultCodePoint = str.codePointAt(index);
console.log(resultCodePoint); // 출력: 66

// 2. 이모지 확인
const emojiIndex = 5; // 인덱스 5에 위치한 문자는 "🎄"
const resultEmojiCode = str.codePointAt(emojiIndex);
console.log(resultEmojiCode); // 출력: 127876
str.codePointAt(index)
const str = "🎄";
console.log(str.codePointAt(0)); // 127876 (정상)
console.log(str.codePointAt(1)); // 56836  (어라? 이건 뭐지?)
/**
 * 문자열에서 서로게이트 쌍을 고려하여 N번째 문자의 코드 포인트를 반환합니다.
 * @param {string} str - 대상 문자열
 * @param {number} charIndex - 가져오려는 문자의 순서 (0부터 시작)
 */
function getSafeCodePoint(str, charIndex) {
    let count = 0;
    for (let char of str) {
        if (count === charIndex) {
            return char.codePointAt(0);
        }
        count++;
    }
    return undefined; // 인덱스를 벗어난 경우
}

const text = "A🎄B";
console.log(getSafeCodePoint(text, 0)); // 65 (A)
console.log(getSafeCodePoint(text, 1)); // 127876 (🎄 - 인덱스 1, 2를 합쳐서 1번째 문자로 인식)
console.log(getSafeCodePoint(text, 2)); // 66 (B - 실제 문자열 인덱스는 3이지만 2번째 문자로 인식)
/**
 * 문자열을 배열로 변환하여, 실제 문자 순서(index)에 맞는 코드 포인트를 반환합니다.
 * @param {string} str - 대상 문자열
 * @param {number} charIndex - 가져오려는 문자의 순서 (0부터 시작)
 */
function getCodePointByIndex(str, charIndex) {
    // 1. 문자열을 코드 포인트 단위의 배열로 변환 (이모지도 한 칸으로 합쳐짐)
    const charArray = [...str]; 
    
    // 2. 배열의 인덱스는 우리가 눈으로 보는 문자 순서와 정확히 일치합니다.
    const targetChar = charArray[charIndex];
    
    // 3. 해당 문자가 존재하면 코드 포인트를 반환합니다.
    return targetChar ? targetChar.codePointAt(0) : undefined;
}

const text = "A🎄B"; // 실제 문자 구성: [0]번 'A', [1]번 '🎄', [2]번 'B'

console.log(getCodePointByIndex(text, 1)); // 127876 (🎄의 온전한 값 반환)
console.log(getCodePointByIndex(text, 2)); // 66 (B의 값 반환)
function checkCharacterType(char) {
    // 0번 인덱스의 코드 포인트 값을 읽어옵니다.
    // 이모지(서로게이트 쌍)도 온전한 하나의 숫자로 읽어냅니다.
    const code = char.codePointAt(0);
    
    // 빈 문자열이 전달된 경우를 방어하기 위한 처리
    if (code === undefined) { 
        return "유효하지 않은 문자";
    }

    switch (true) {
        case (code >= 65 && code <= 90):
            return "영어 대문자";
        case (code >= 97 && code <= 122):
            return "영어 소문자";
        case (code >= 48 && code <= 57):
            return "숫자";
        case (code >= 44032 && code <= 55203):
            return "한글(가~힣)";
        // Emoticons 블록(대표적인 표정 이모지) 범위 체크
        case (code >= 128512 && code <= 128586):
            return "이모지(Emoticons)";
        default:
            return "기타 문자 또는 특수 기호";
    }
}

// 결과 확인
console.log(checkCharacterType("A"));    // 출력: 영어 대문자
console.log(checkCharacterType("7"));    // 출력: 숫자
console.log(checkCharacterType("코"));   // 출력: 한글(가~힣)
console.log(checkCharacterType("😃"));   // 출력: 이모지
/**
 * 두 문자의 유니코드 코드 포인트 값을 비교하여 정렬 순서를 반환합니다.
 * 결과값이 음수이면 첫 번째 문자가 앞서고, 양수이면 뒤에 옵니다.
 */
function compareCharacters(char1, char2) {
    // codePointAt을 사용하여 이모지를 포함한 모든 문자의 온전한 값을 읽어옵니다.
    const code1 = char1.codePointAt(0);
    const code2 = char2.codePointAt(0);
    
    // 두 코드 포인트 값의 차이를 반환하여 정렬 순서를 결정합니다.
    return code1 - code2;
}

// 1. 영어 대문자 비교
const result1 = compareCharacters("A", "B"); 
console.log(result1); // -1 (65 - 66): 'A'가 'B'보다 앞섬

// 2. 영어 소문자 비교
const result2 = compareCharacters("b", "a"); 
console.log(result2); // 1 (98 - 97): 'b'가 'a'보다 뒤에 옴

// 3. 대소문자 비교
const result3 = compareCharacters("A", "a"); 
console.log(result3); // -32 (65 - 97): 대문자가 소문자보다 앞섬

// 4. 이모지가 포함된 비교
const result4 = compareCharacters("😃", "A");
console.log(result4); // 128447 (128512 - 65): 이모지는 영어보다 훨씬 뒤에 정렬됨