import Chat from "@/customer-service/xim";

export async function uploadFile(file: File, uploading?: (p: number) => void) {
    const sdk = Chat.getSdk();
    const { url } = await sdk.uploadFileV2(file, {
        onUploadProgress: (e) => uploading && uploading(e.percent),
    });
    return `${sdk.global.baseUrl}${url}`;
}

export const enum UploadType {
    Default,
    Image,
    Camera
}

/**
 * x
 * @param type UploadType 默认值 UploadType.Default
 * @param size 可不传 单位M
 * @returns 
 */
export function chooseFileAndUpload(type = UploadType.Default, size?: number) {
    return chooseFile(type).then(r => {
        const sdk = Chat.getSdk();
        return sdk.uploadFileV2(r)
    })
}

/**
 * 
 * @param type UploadType
 * @param size 可不传 单位M
 * @returns 
 */
export function chooseFile(type = UploadType.Default, size?: number) {
    return new Promise<File>((resolve, reject) => {
        const target = document.createElement('input');
        target.setAttribute('type', 'file');
        // 添加这个属性,就可以唤起相机的功能
        (type === UploadType.Camera) && target.setAttribute('capture', 'camera');
        // 这里如果不加属性 accept 是 "image/*" 或者 "video/*",就默认打开摄像头,既可以拍照也可以录像
        (type === UploadType.Image) && target.setAttribute('accept', 'image/*');
        target.setAttribute('style', 'display:none');
        // 监听改变事件
        target.addEventListener('change', (e: Event) => {
            // 拿到文件对象
            if (e && e.target) {
                const t = e.target as HTMLInputElement;
                const { files } = t;
                if (files) {
                    // 返回的是一个文件对象
                    if (size && files[0].size >= size * 1024 * 1024) {
                        reject(`上传的${type === UploadType.Default ? "文件" : "图片"}太大了~`);
                        return;
                    }
                    resolve(files[0]);
                    setTimeout(() => target.remove(), 200);
                    return;
                }
            }
            reject(new Error('系统不支持'));
            setTimeout(() => target.remove(), 200);
        });
        document.body.appendChild(target);
        // 这里是模拟点击了input控件
        target.click();
    });
}