package com.tsi.common.utils;

import java.nio.charset.StandardCharsets;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class StringUtils {

    private StringUtils() {}

    public static String getString(boolean value) {
        return value ? "1" : "0";
    }

    public static List<String> splitEmpty(String value, String separator) {
        List<String> results = new ArrayList<String>();
        StringTokenizer stringTokenizer = new StringTokenizer(value, separator);
        while (stringTokenizer.hasMoreTokens()) {
            results.add(stringTokenizer.nextToken().trim());
        }
        return results;
    }

    public static List<String> split(String value, String separator) {
        String[] splits = value.split(separator);
        List<String> results = new ArrayList<String>();
        for (int ii = 0; ii < splits.length; ii++) {
            splits[ii] = splits[ii].trim();
            if (!splits[ii].isEmpty()) {
                results.add(splits[ii]);
            }
        }
        return results;
    }

    public static boolean isEmpty(String str) {
        return str == null || str.isEmpty();
    }

    public static boolean isBlank(String s) {
        return s == null || s.trim().isEmpty();
    }

    public static String safeSubstring(String input, int maxBytes) {
        if (input == null || input.isEmpty()) return "";

        byte[] bytes = input.getBytes(StandardCharsets.UTF_8);
        if (bytes.length <= maxBytes) return input;

        int byteCount = 0;
        int charIndex = 0;
        for (char c : input.toCharArray()) {
            int charBytes = String.valueOf(c).getBytes(StandardCharsets.UTF_8).length;
            if (byteCount + charBytes > maxBytes) break;
            byteCount += charBytes;
            charIndex++;
        }

        return input.substring(0, charIndex);
    }

    /**
     * 주어진 문자열을 구분자로 분리하고, 각 요소의 앞뒤 공백을 제거한 후,
     * 비어있지 않은 요소들만 스트림으로 반환합니다.
     *
     * @param str       분리할 문자열
     * @param delimiter 구분자
     * @return 처리된 문자열의 스트림
     */
    public static Stream<String> splitToStream(String str, String delimiter) {
        // 입력이 null이거나 비어있으면, 빈 스트림을 반환하여 NullPointerException을 방지합니다.
        if (str == null || str.trim().isEmpty()) {
            return Stream.empty();
        }

        return Arrays.stream(str.split(delimiter)) // 1. 쉼표로 문자열 배열을 생성하고 스트림으로 변환
                .map(String::trim)            // 2. 각 요소의 앞뒤 공백 제거
                .filter(s -> !s.isEmpty());   // 3. 빈 문자열 요소는 필터링
    }

    /**
     * splitToStream을 사용하여 바로 Set으로 수집하는 편의 메서드입니다.
     */
    public static Set<String> splitToSet(String str, String delimiter) {
        return splitToStream(str, delimiter).collect(Collectors.toSet());
    }

}
