// 获取uuid
export function generateUUID() {
    var d = new Date().getTime();
    var d2 = ((typeof performance !== 'undefined') && performance.now && (performance.now() * 1000)) || 0;
    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
        var r = Math.random() * 16;
        if (d > 0) {
            r = (d + r) % 16 | 0;
            d = Math.floor(d / 16);
        } else {
            r = (d2 + r) % 16 | 0;
            d2 = Math.floor(d2 / 16);
        }
        return (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);
    });
}

/**
 * 过滤掉可信度(confidence)小于0.6的数据项
 * @param {Array} data - 要过滤的数组，数组项应包含confidence属性
 * @returns {Array} 过滤后的新数组
 */
export function filteConfidence(data) {
    // 检查输入是否为数组
    if (!Array.isArray(data)) {
        console.warn('filteConfidence: 输入参数不是数组');
        return [];
    }

    // 过滤并返回新数组
    return data.filter(item => {
        return item && typeof item === 'object' &&
            'confidence' in item &&
            Number(item.confidence) >= 0.6;
    });
}

/**
 * 根据检测结果截取图片中的多个区域
 * @param {HTMLImageElement|String} image - 图片元素或图片URL
 * @param {Array} detectionResults - 检测结果数组，包含box坐标
 * @param {Object} options - 可选配置
 * @param {Number} options.minConfidence - 最小置信度阈值，默认0.5
 * @param {String} options.outputFormat - 输出格式，默认'image/png'
 * @param {Number} options.outputQuality - 输出质量(0-1)，默认0.92
 * @returns {Promise<Array<{blob: Blob, data: Object}>>} 返回截取图片和相关数据的数组
 */
export async function cropDetectedRegions(image, detectionResults, options = {}) {
    // 合并默认配置
    const {
        minConfidence = 0.6,
        outputFormat = 'image/png',
        outputQuality = 0.92
    } = options;

    // 如果传入的是URL字符串，先加载图片
    const img = typeof image === 'string'
        ? await loadImage(image)
        : image;

    // 创建画布
    const canvas = document.createElement('canvas');
    const ctx = canvas.getContext('2d');

    // 存储所有截取结果
    const croppedResults = [];

    // 遍历所有检测结果
    for (const result of detectionResults) {
        // 检查置信度是否达标
        if (result.confidence < minConfidence) {
            console.log(`跳过置信度低于阈值(${minConfidence})的检测结果:`, result);
            continue;
        }

        const { x1, y1, x2, y2 } = result.box;
        const width = x2 - x1;
        const height = y2 - y1;

        // 检查坐标是否有效
        if (!isValidBox(x1, y1, x2, y2, img.width, img.height)) {
            console.warn('无效的坐标区域:', result.box);
            continue;
        }

        // 设置画布尺寸
        canvas.width = width;
        canvas.height = height;

        // 清空画布
        ctx.clearRect(0, 0, width, height);

        // 绘制截取区域
        ctx.drawImage(
            img,
            x1, y1,         // 源图像裁剪起始坐标
            width, height,   // 源图像裁剪宽高
            0, 0,            // 画布起始坐标
            width, height    // 画布绘制宽高
        );

        // 将画布内容转为Blob对象
        const blob = await new Promise((resolve) => {
            canvas.toBlob(
                (blob) => resolve(blob),
                outputFormat,
                outputQuality
            );
        });

        // 保存结果及相关数据
        croppedResults.push({
            blob,
            data: {
                ...result,
                cropInfo: {
                    x: x1,
                    y: y1,
                    width,
                    height
                }
            }
        });
    }

    return croppedResults;
}

/**
 * 加载图片
 * @param {String} url - 图片URL
 * @returns {Promise<HTMLImageElement>}
 */
export function loadImage(url) {
    return new Promise((resolve, reject) => {
        const img = new Image();
        img.crossOrigin = 'Anonymous'; // 处理跨域问题
        img.onload = () => resolve(img);
        img.onerror = reject;
        img.src = url;
    });
}

/**
 * 检查坐标框是否有效
 * @param {Number} x1 - 左上角x坐标
 * @param {Number} y1 - 左上角y坐标
 * @param {Number} x2 - 右下角x坐标
 * @param {Number} y2 - 右下角y坐标
 * @param {Number} imgWidth - 图片宽度
 * @param {Number} imgHeight - 图片高度
 * @returns {Boolean}
 */
function isValidBox(x1, y1, x2, y2, imgWidth, imgHeight) {
    return (
        x1 >= 0 && y1 >= 0 &&
        x2 > x1 && y2 > y1 &&
        x2 <= imgWidth && y2 <= imgHeight
    );
}