package com.cloudcc.core;

import java.util.Date;
import java.util.Random;

public class StringUtils {

    public static boolean isNull(Object s) {
        return s == null;
    }

    public static boolean isNullOrEmpty(Object s) {
        return s == null || s.equals("");
    }

    public static boolean isNotNullAndEmpty(Object s) {
        return s != null && !s.equals("");
    }

    public static Object convertNullToEmpty(Object obj) {
        return obj == null ? "" : obj;
    }

    /**
     * 取记录 ID 的对象前缀（前3位）。
     */
    public static String getObjectPrefix(String recordId) {
        if (recordId != null && recordId.length() >= 3) {
            return recordId.substring(0, 3);
        }
        return recordId;
    }

    /**
     * 比较两个值是否相等（支持 String 和 Date）。
     * null 和 "" 视为相等。
     */
    public static boolean assertEqual(Object obj1, Object obj2) {
        if (isNotNullAndEmpty(obj1) && isNullOrEmpty(obj2)) return false;
        if (isNotNullAndEmpty(obj2) && isNullOrEmpty(obj1)) return false;
        if (isNullOrEmpty(obj1) && isNullOrEmpty(obj2)) return true;
        if (obj1 instanceof String) return obj1.equals(obj2);
        if (obj1 instanceof Date) return ((Date) obj1).getTime() == ((Date) obj2).getTime();
        return false;
    }

    /**
     * 比较两个值是否相等（严格区分 null 与 ""）。
     */
    public static boolean assertEqualNew(Object obj1, Object obj2) {
        if (isNull(obj1) && isNull(obj2)) return true;
        if (isNull(obj1) && !isNull(obj2) && "".equals(obj2)) return false;
        if (isNull(obj2) && !isNull(obj1) && "".equals(obj1)) return false;
        if (isNotNullAndEmpty(obj1) && isNullOrEmpty(obj2)) return false;
        if (isNotNullAndEmpty(obj2) && isNullOrEmpty(obj1)) return false;
        if (isNullOrEmpty(obj1) && isNullOrEmpty(obj2)) return true;
        if (obj1 instanceof String) return obj1.equals(obj2);
        if (obj1 instanceof Date) return ((Date) obj1).getTime() == ((Date) obj2).getTime();
        return false;
    }

    /**
     * 对 HTML 特殊字符做简单转义，防止 XSS（仅转义 &lt;）。
     */
    public static String escapeHtml(Object o) {
        if (o != null && !"".equals(o)) {
            return o.toString().replaceAll("<", "&lt;");
        }
        return "";
    }

    /**
     * 获取字符串的实际字节长度，汉字等宽字符计为3，ASCII计为1。
     */
    public static int getLength(String s) {
        if (s == null || "".equals(s)) return 0;
        char[] c = s.toCharArray();
        int len = 0;
        for (char ch : c) {
            len++;
            if ((ch / 0x80) != 0) len += 2;
        }
        return len;
    }

    /**
     * 生成指定长度的大写字母+数字随机串。
     */
    public static String getCharAndNumber(int length) {
        Random random = new Random();
        StringBuilder sb = new StringBuilder();
        String charStr = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        int charLength = charStr.length();
        for (int i = 0; i < length; i++) {
            sb.append(charStr.charAt(random.nextInt(charLength)));
        }
        return sb.toString();
    }
}
