/**
 * LightApp 文件上传工具类封装
 * * 使用方法:
 * 1. 列表选择上传: 
 * FileUploader.showMenuAndUpload({ baseUrl: 'http://...' }).then(res => ...);
 * * 2. 直接调用某种类型上传:
 * FileUploader.directUpload({ 
 * baseUrl: 'http://...', 
 * chooseType: 'chooseImageUpload' 
 * }).then(res => ...);
 */
import config from "@/config.js"

export default {
    /**
     * 默认配置
     */
    defaults: {
        baseUrl: config.baseUrl, // 必填，API的基础路径
        uploadPath: '/app/oss/upload', // 上传接口路径
        fileKey: 'file',
        maxSize: 10,
        maxSelectNum: 1,
        minTime: 3,
        maxTime: 15,
        transmissionType: 0, // 0-图片地址, 1-base64
    },

    /**
     * 映射菜单索引到上传类型
     */
    typeMapping: {
        0: 'chooseImageUpload', // 相册
        1: 'takingPicturesUpload', // 相机
        2: 'takingVideoUpload', // 视频
        3: 'chooseFileUpload' // 文件
    },

    /**
     * 核心方法：调用 SDK 的 chooseFileUpload
     * @param {Object} options - 配置项
     * @returns {Promise}
     */
    _executeUpload: function(options) {
        return new Promise((resolve, reject) => {
            // 合并配置
            const config = {
                ...this.defaults,
                ...options
            };

            // 构造 SDK 需要的参数结构
            const pam = {
                url: config.baseUrl + config.uploadPath,
                fileKey: config.fileKey,
                params: config.params || {},
                header: config.header || {},
                chooseType: config.chooseType || 'chooseFileUpload',
                transmissionType: config.transmissionType,
                maxSize: config.maxSize,
                maxSelectNum: config.maxSelectNum,
                minTime: config.minTime,
                maxTime: config.maxTime
            };

            // 针对特定类型的特殊处理 (参考原代码逻辑)
            if (config.chooseType === 'takingPicturesUpload') {
                // 原代码注释中提到: // pam1.fileKey = 'picfile'; 
                // 如果需要特殊 fileKey 可以在这里处理
            }

            console.log('开始调用SDK上传, 参数:', pam);

            if (typeof lightAppJssdk === 'undefined') {
                const msg = 'lightAppJssdk 未定义，请在 爱山东 环境中运行';
                alert(msg);
                return reject(msg);
            }
            lightAppJssdk.uploadFile.chooseFileUpload({
                arg0: pam,
                success: function(data) {
                    // 支持传入 success 回调，也支持 Promise resolve
                    if (options.success) options.success(data);
                    console.log(data)
                    resolve(data);
                },
                fail: function(err) {
                    // 支持传入 fail 回调，也支持 Promise reject
                    if (options.fail) options.fail(err);
                    // 默认弹窗提示错误，可以通过 silent: true 关闭
                    if (!options.silent) alert(typeof err === 'object' ? JSON.stringify(
                        err) : err);
                    reject(err);
                }
            });
        });
    },

    /**
     * 场景1: 弹出菜单选择，然后上传 (封装了原 selectFile)
     * @param {Object} options - 配置项 (需包含 baseUrl)
     */
    showMenuAndUpload: function(options = {}) {
        return new Promise((resolve, reject) => {
            if (typeof lightAppJssdk === 'undefined') {
                alert('lightAppJssdk 未定义');
                return reject('lightAppJssdk undefined');
            }

            const menuList = options.menuList || ['相册', '相机', '视频', '文件'];

            lightAppJssdk.notification.showMediaAlert({
                arg0: menuList,
                success: (data) => {
                    // data.index 对应 menuList 的索引
                    const selectedType = this.typeMapping[data.index];

                    if (!selectedType) {
                        const err = '未知的选择类型';
                        if (options.fail) options.fail(err);
                        return reject(err);
                    }

                    // 选中后，调用核心上传方法
                    this._executeUpload({
                        ...options,
                        chooseType: selectedType
                    }).then(resolve).catch(reject);
                },
                fail: (err) => {
                    if (options.fail) options.fail(err);
                    if (!options.silent) alert(err);
                    reject(err);
                }
            });
        });
    },

    /**
     * 场景2: 直接上传 (不弹窗，直接调起特定类型的上传)
     * @param {Object} options - 需包含 baseUrl 和 chooseType
     */
    directUpload: function(options = {}) {
        if (!options.chooseType) {
            // 如果没传类型，默认当做普通文件上传
            options.chooseType = 'chooseFileUpload';
        }
        return this._executeUpload(options);
    }
};