/**
 * 将KB转换为可读的文件大小格式
 * 支持从字节（B）到TB的所有单位，最小单位为B
 *
 * @param {number} kb - 文件大小（KB）
 * @returns {string} 格式化后的文件大小字符串
 *
 * @example
 * kbToSize(1073741824) // "1 TB"
 * kbToSize(1048576) // "1 GB"
 * kbToSize(1024) // "1 MB"
 * kbToSize(512) // "512 KB"
 * kbToSize(1) // "1 KB"
 * kbToSize(0.5) // "512 B"
 * kbToSize(0.1) // "102.4 B"
 * kbToSize(0.0001) // "0.1 B"
 * kbToSize(0) // "0 B"
 */ export var kbToSize = function kbToSize(kb) {
    var sizes = [
        'B',
        'KB',
        'MB',
        'GB',
        'TB'
    ];
    var bytes = kb * 1024;
    // 处理边界情况：0或负数直接返回0 B
    if (bytes <= 0) {
        return '0 B';
    }
    // 如果小于1KB，直接返回字节
    if (bytes < 1024) {
        return parseFloat(bytes.toFixed(2)) + ' ' + sizes[0];
    }
    var i = Math.floor(Math.log(bytes) / Math.log(1024));
    return parseFloat((bytes / Math.pow(1024, i)).toFixed(2)) + ' ' + sizes[i];
};
/**
 * 检查文件是否为图片类型
 * 通过 MIME 类型和文件扩展名双重判断
 *
 * @param {File} file - 要检查的文件
 * @returns {boolean} 是否为图片文件
 */ export var isImageFile = function isImageFile(file) {
    var _file_type;
    // 首先检查 MIME 类型
    if (file === null || file === void 0 ? void 0 : (_file_type = file.type) === null || _file_type === void 0 ? void 0 : _file_type.startsWith('image/')) {
        return true;
    }
    // 如果 MIME 类型不可用或不准确，检查文件扩展名
    var imageExtensions = [
        '.jpg',
        '.jpeg',
        '.png',
        '.gif',
        '.bmp',
        '.webp',
        '.svg',
        '.ico',
        '.tiff',
        '.tif'
    ];
    var fileName = file.name.toLowerCase();
    return imageExtensions.some(function(ext) {
        return fileName.endsWith(ext);
    });
};
var VIDEO_EXTENSIONS = [
    '.mp4',
    '.webm',
    '.ogg',
    '.ogv',
    '.mov',
    '.avi',
    '.wmv',
    '.flv',
    '.m4v',
    '.mkv'
];
var hasVideoExtension = function hasVideoExtension(pathOrName) {
    var lower = (pathOrName === null || pathOrName === void 0 ? void 0 : pathOrName.toLowerCase()) || '';
    var beforeQuery = lower.split('?')[0];
    return VIDEO_EXTENSIONS.some(function(ext) {
        return beforeQuery.endsWith(ext);
    });
};
/**
 * 检查文件是否为视频类型
 * 通过 MIME 类型和文件扩展名双重判断
 *
 * @param {File} file - 要检查的文件（含 AttachmentFile）
 * @returns {boolean} 是否为视频文件
 */ export var isVideoFile = function isVideoFile(file) {
    var _file_type;
    if ((_file_type = file.type) === null || _file_type === void 0 ? void 0 : _file_type.startsWith('video/')) {
        return true;
    }
    if (hasVideoExtension(file.name)) {
        return true;
    }
    var attachmentFile = file;
    var url = attachmentFile.previewUrl || attachmentFile.url;
    return !!url && hasVideoExtension(url);
};
/**
 * 检查文件是否为可展示的媒体类型（图片或视频）
 */ export var isMediaFile = function isMediaFile(file) {
    return isImageFile(file) || isVideoFile(file);
};
/**
 * 是否为「仅元信息占位」状态：有 status 但无 url/previewUrl，内容未拿到时整行以 FileMetaPlaceholder 风格展示
 */ export var isAttachmentFileLoading = function isAttachmentFileLoading(status) {
    return status === 'uploading' || status === 'pending';
};
/**
 * 是否应该展示 FileMetaPlaceholder：
 * - 有状态
 * - 非 loading（uploading/pending）
 * - 且没有可预览 URL
 */ export var isFileMetaPlaceholderState = function isFileMetaPlaceholderState(file) {
    return file.status !== undefined && file.status !== null && !isAttachmentFileLoading(file.status) && !file.url && !file.previewUrl;
};
/**
 * 设备 / 环境检测函数已统一迁移到 `src/Utils/env.ts`。
 *
 * 此处保留 re-export 以维持模块外部既有的导入路径不变（包含
 * `src/index.ts` 与 `tests/AttachmentButtonPopover.branches.test.tsx` 等）。
 * 新代码请直接从 `src/Utils/env` 导入。
 */ export { getDeviceBrand, isMobileDevice, isOppoDevice, isVivoDevice, isVivoOrOppoDevice, isWeChat } from "../../Utils/env";
