package com.kt.event.common.util;

import org.apache.commons.lang3.StringUtils;

/**
 * 문자열 유틸리티
 * 문자열 처리 관련 공통 기능 제공
 */
public class StringUtil {

    /**
     * 문자열이 null이거나 공백인지 확인
     *
     * @param str 확인할 문자열
     * @return null 또는 공백 여부
     */
    public static boolean isBlank(String str) {
        return StringUtils.isBlank(str);
    }

    /**
     * 문자열이 null이 아니고 공백이 아닌지 확인
     *
     * @param str 확인할 문자열
     * @return null 또는 공백이 아닌지 여부
     */
    public static boolean isNotBlank(String str) {
        return StringUtils.isNotBlank(str);
    }

    /**
     * 전화번호 마스킹 처리
     * 예: 010-1234-5678 → 010-****-5678
     *
     * @param phoneNumber 전화번호
     * @return 마스킹된 전화번호
     */
    public static String maskPhoneNumber(String phoneNumber) {
        if (isBlank(phoneNumber)) {
            return phoneNumber;
        }

        String cleaned = phoneNumber.replaceAll("[^0-9]", "");

        if (cleaned.length() == 11) {
            return cleaned.substring(0, 3) + "-****-" + cleaned.substring(7);
        } else if (cleaned.length() == 10) {
            return cleaned.substring(0, 3) + "-***-" + cleaned.substring(6);
        }

        return phoneNumber;
    }

    /**
     * 사업자번호 마스킹 처리
     * 예: 123-45-67890 → 123-**-****0
     *
     * @param businessNumber 사업자번호
     * @return 마스킹된 사업자번호
     */
    public static String maskBusinessNumber(String businessNumber) {
        if (isBlank(businessNumber)) {
            return businessNumber;
        }

        String cleaned = businessNumber.replaceAll("[^0-9]", "");

        if (cleaned.length() == 10) {
            return cleaned.substring(0, 3) + "-**-****" + cleaned.substring(9);
        }

        return businessNumber;
    }

    /**
     * 이메일 마스킹 처리
     * 예: user@example.com → u***@example.com
     *
     * @param email 이메일
     * @return 마스킹된 이메일
     */
    public static String maskEmail(String email) {
        if (isBlank(email) || !email.contains("@")) {
            return email;
        }

        String[] parts = email.split("@");
        String localPart = parts[0];
        String domain = parts[1];

        if (localPart.length() <= 1) {
            return email;
        }

        String masked = localPart.charAt(0) + "***";
        return masked + "@" + domain;
    }

    /**
     * 문자열을 지정된 길이로 자르고 말줄임표 추가
     *
     * @param str       원본 문자열
     * @param maxLength 최대 길이
     * @return 잘린 문자열
     */
    public static String truncate(String str, int maxLength) {
        if (isBlank(str) || str.length() <= maxLength) {
            return str;
        }
        return str.substring(0, maxLength) + "...";
    }

    /**
     * null인 경우 기본값 반환
     *
     * @param str          원본 문자열
     * @param defaultValue 기본값
     * @return 원본 또는 기본값
     */
    public static String defaultIfBlank(String str, String defaultValue) {
        return StringUtils.defaultIfBlank(str, defaultValue);
    }

    /**
     * 문자열에서 공백 제거
     *
     * @param str 원본 문자열
     * @return 공백이 제거된 문자열
     */
    public static String removeWhitespace(String str) {
        if (isBlank(str)) {
            return str;
        }
        return str.replaceAll("\\s+", "");
    }

    /**
     * 전화번호 포맷 검증
     *
     * @param phoneNumber 전화번호
     * @return 유효한 전화번호 형식 여부
     */
    public static boolean isValidPhoneNumber(String phoneNumber) {
        if (isBlank(phoneNumber)) {
            return false;
        }
        String cleaned = phoneNumber.replaceAll("[^0-9]", "");
        return cleaned.length() >= 10 && cleaned.length() <= 11;
    }

    /**
     * 이메일 포맷 검증
     *
     * @param email 이메일
     * @return 유효한 이메일 형식 여부
     */
    public static boolean isValidEmail(String email) {
        if (isBlank(email)) {
            return false;
        }
        String emailRegex = "^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+\\.[A-Z|a-z]{2,}$";
        return email.matches(emailRegex);
    }

    /**
     * 사업자번호 포맷 검증
     *
     * @param businessNumber 사업자번호
     * @return 유효한 사업자번호 형식 여부
     */
    public static boolean isValidBusinessNumber(String businessNumber) {
        if (isBlank(businessNumber)) {
            return false;
        }
        String cleaned = businessNumber.replaceAll("[^0-9]", "");
        return cleaned.length() == 10;
    }
}
