/**
 * 将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;
};
/**
 * 设备品牌匹配列表
 */ var UA_MATCH_LIST = [
    {
        name: 'iphone',
        matchList: [
            /iPhone/i
        ]
    },
    {
        name: '华为',
        matchList: [
            /HUAWEI/i,
            /SPN-AL00/i,
            /GLK-AL00/i,
            /Huawei/i,
            /HMSCore/i,
            /HW/
        ]
    },
    {
        name: '荣耀',
        matchList: [
            /HONOR/i
        ]
    },
    {
        name: 'oppo',
        matchList: [
            /PCAM10/i,
            /OPPO/i,
            /PCH/,
            /PBAM00/,
            /PBEM00/,
            /HeyTapBrowser/,
            /PADT00/,
            /PCDM10/
        ]
    },
    {
        name: 'vivo',
        matchList: [
            /V1981A/i,
            /vivo/i,
            /V1818A/,
            /V1838A/,
            /V19/,
            /VivoBrowser/
        ]
    },
    {
        name: '小米',
        matchList: [
            /Redmi/i,
            /HM/,
            /MIX/i,
            /MI/,
            /XiaoMi/
        ]
    },
    {
        name: '金利',
        matchList: [
            /GN708T/i
        ]
    },
    {
        name: 'oneplus',
        matchList: [
            /GM1910/i,
            /ONEPLUS/i
        ]
    },
    {
        name: 'sony',
        matchList: [
            /SOV/i,
            /LT29i/,
            /Xperia/
        ]
    },
    {
        name: '三星',
        matchList: [
            /SAMSUNG/i,
            /SM-/,
            /GT/,
            /SCH-I939I/
        ]
    },
    {
        name: '魅族',
        matchList: [
            /MZ-/,
            /MX4/i,
            /M355/,
            /M353/,
            /M351/,
            /M811/,
            /PRO 7-H/
        ]
    },
    {
        name: '华硕',
        matchList: [
            /ASUS/
        ]
    },
    {
        name: '美图',
        matchList: [
            /MP/
        ]
    },
    {
        name: '天语',
        matchList: [
            /K-Touch/
        ]
    },
    {
        name: '联想',
        matchList: [
            /Lenovo/i
        ]
    },
    {
        name: '宇飞来',
        matchList: [
            /YU FLY/i
        ]
    },
    {
        name: '糖果',
        matchList: [
            /SUGAR/i
        ]
    },
    {
        name: '酷派',
        matchList: [
            /Coolpad/i
        ]
    },
    {
        name: 'ecell',
        matchList: [
            /ecell/i
        ]
    },
    {
        name: '詹姆士',
        matchList: [
            /A99A/i
        ]
    },
    {
        name: 'tcl',
        matchList: [
            /TCL/i
        ]
    },
    {
        name: '捷语',
        matchList: [
            /6000/i,
            /V1813A/
        ]
    },
    {
        name: '8848',
        matchList: [
            /8848/i
        ]
    },
    {
        name: 'H6',
        matchList: [
            /H6/
        ]
    },
    {
        name: '中兴',
        matchList: [
            /ZTE/i
        ]
    },
    {
        name: '努比亚',
        matchList: [
            /NX/
        ]
    },
    {
        name: '海信',
        matchList: [
            /HS/
        ]
    },
    {
        name: 'HTC',
        matchList: [
            /HTC/
        ]
    }
];
/**
 * 获取设备品牌
 *
 * @param {string} [ua] - User Agent 字符串，如果不提供则使用 navigator.userAgent
 * @returns {string | false} 设备品牌名称，如果无法匹配则返回 false
 *
 * @example
 * ```ts
 * getDeviceBrand() // 'vivo' | '华为' | 'iphone' | false
 * getDeviceBrand('Mozilla/5.0...vivo...') // 'vivo'
 * ```
 */ export var getDeviceBrand = function getDeviceBrand(ua) {
    if (typeof navigator === 'undefined' && !ua) {
        return false;
    }
    var userAgent = ua || navigator.userAgent;
    // 遍历匹配列表
    for(var i = 0; i < UA_MATCH_LIST.length; i++){
        var uaDetail = UA_MATCH_LIST[i];
        for(var j = 0; j < uaDetail.matchList.length; j++){
            var re = uaDetail.matchList[j];
            if (re.test(userAgent)) {
                return uaDetail.name;
            }
        }
    }
    // 如果匹配列表中没有找到，尝试从 Build 信息中提取
    var brandMatch = /; ([^;]+) Build/.exec(userAgent);
    if (brandMatch) {
        return brandMatch[1];
    }
    return false;
};
/**
 * 检测是否为 vivo 手机
 *
 * @param {string} [ua] - User Agent 字符串，如果不提供则使用 navigator.userAgent
 * @returns {boolean} 是否为 vivo 设备
 *
 * @example
 * ```ts
 * isVivoDevice() // true | false
 * ```
 */ export var isVivoDevice = function isVivoDevice(ua) {
    var brand = getDeviceBrand(ua);
    return brand === 'vivo';
};
/**
 * 检测是否为 oppo 手机
 *
 * @param {string} [ua] - User Agent 字符串，如果不提供则使用 navigator.userAgent
 * @returns {boolean} 是否为 oppo 设备
 *
 * @example
 * ```ts
 * isOppoDevice() // true | false
 * ```
 */ export var isOppoDevice = function isOppoDevice(ua) {
    var brand = getDeviceBrand(ua);
    return brand === 'oppo';
};
/**
 * 检测是否为 vivo 或 oppo 手机
 *
 * @param {string} [ua] - User Agent 字符串，如果不提供则使用 navigator.userAgent
 * @returns {boolean} 是否为 vivo 或 oppo 设备
 *
 * @example
 * ```ts
 * isVivoOrOppoDevice() // true | false
 * ```
 */ export var isVivoOrOppoDevice = function isVivoOrOppoDevice(ua) {
    return isVivoDevice(ua) || isOppoDevice(ua);
};
/**
 * 检测是否为移动设备
 *
 * @returns {boolean} 是否为移动设备
 *
 * @example
 * ```ts
 * isMobileDevice() // true | false
 * ```
 */ export var isMobileDevice = function isMobileDevice() {
    if (typeof navigator === 'undefined') {
        return false;
    }
    var userAgent = navigator.userAgent.toLowerCase();
    // 检测常见的移动设备标识
    var mobileRegex = /android|webos|iphone|ipad|ipod|blackberry|iemobile|opera mini|mobile|mobile safari|micromessenger/i;
    // 检测触摸设备
    var hasTouchScreen = 'ontouchstart' in window || navigator.maxTouchPoints > 0;
    // 检测屏幕宽度（移动设备通常小于 768px）
    var isSmallScreen = typeof window !== 'undefined' && window.innerWidth <= 768;
    return mobileRegex.test(userAgent) || hasTouchScreen && isSmallScreen;
};
/**
 * 检测是否为微信环境
 *
 * @param {string} [ua] - User Agent 字符串，如果不提供则使用 navigator.userAgent
 * @returns {boolean} 是否为微信环境
 *
 * @example
 * ```ts
 * isWeChat() // true | false
 * ```
 */ export var isWeChat = function isWeChat(ua) {
    if (typeof navigator === 'undefined' && !ua) {
        return false;
    }
    var userAgent = (ua || navigator.userAgent).toLowerCase();
    return /micromessenger/i.test(userAgent);
};
