// 优雅实现对象操作工具函数集合

/**
 * 深拷贝对象或数组
 * @param input 需要深拷贝的对象或数组
 * @returns 深拷贝后的新对象/数组
 */
export function deepClone<T>(input: T): T {
    if (input === null || typeof input !== 'object') return input;
    if (Array.isArray(input)) return input.map(deepClone) as unknown as T;

    const result = {} as T;
    for (const key in input) {
        if (Object.prototype.hasOwnProperty.call(input, key)) {
            result[key] = deepClone(input[key]);
        }
    }
    return result;
}

/**
 * 合并多个对象
 * @param objects 需要合并的对象列表
 * @returns 合并后的对象
 */
export function mergeObjects<T>(...objects: Partial<T>[]): T {
    return objects.reduce((acc: Partial<T>, obj) => {
        for (const key in obj) {
            if (Object.prototype.hasOwnProperty.call(obj, key)) {
                if (typeof acc[key] === 'object' && typeof obj[key] === 'object') {
                    acc[key] = mergeObjects(acc[key], obj[key]);
                } else {
                    acc[key] = obj[key];
                }
            }
        }
        return acc;
    }, {} as Partial<T>) as T;
}

/**
 * 获取嵌套对象的属性值
 * @param obj 待操作对象
 * @param path 属性路径（以点分隔）
 * @param defaultValue 默认值
 * @returns 属性值或默认值
 */
export function getNestedValue<T, U>(obj: T, path: string, defaultValue: U): U | unknown {
    return path.split('.').reduce((acc: any, key: string) => acc && acc[key], obj) ?? defaultValue;
}

/**
 * 判断对象是否为空
 * @param obj 待检查对象
 * @returns 是否为空对象
 */
export function isEmptyObject(obj: Record<string, unknown>): boolean {
    return Object.keys(obj).length === 0;
}
