// 从指定路径 '../mixins/basic' 导入名为 'basic' 的模块（这里假设是一个混入对象，用于扩展组件的功能等）
import { basic } from '../mixins/basic';
// 从 '../mixins/observer/index' 路径导入名为 'observe' 的模块（可能用于实现数据观察等相关功能）
import { observe } from '../mixins/observer/index';

// 这个函数用于将源对象（source）中的某些属性按照给定的映射关系（map）复制到目标对象（target）中
// 具体来说，遍历映射关系中的每个键（key），如果源对象中存在对应的属性，则将该属性值复制到目标对象的对应映射键名下
function mapKeys(source, target, map) {
    Object.keys(map).forEach(key => {
        if (source[key]) {
            target[map[key]] = source[key];
        }
    });
}

// 定义名为 'VantComponent' 的函数，用于创建一个 Vant 风格的组件（可能是基于微信小程序等框架），接收一个配置对象 'vantOptions'（有默认值为空对象）
function VantComponent(vantOptions = {}) {
    // 创建一个空的对象 'options'，用于存储经过处理后的组件配置选项，后续会逐步往里面添加和调整各项配置
    const options = {};

    // 使用'mapKeys' 函数将 'vantOptions' 中的部分属性按照特定的映射规则复制到 'options' 对象中
    // 例如，将 'data' 属性映射为 'properties'（可能是适配不同框架对于数据定义的要求）等，实现属性名称的转换和整理
    mapKeys(vantOptions, options, {
        data: 'data',
        props: 'properties',
        mixins: 'behaviors',
        methods: 'methods',
        beforeCreate: 'created',
        created: 'attached',
        mounted: 'ready',
        relations: 'relations',
        destroyed: 'detached',
        classes: 'externalClasses'
    });

    // 从 'vantOptions' 中获取'relation' 属性（可能用于定义组件间的关系等）
    const { relation } = vantOptions;
    if (relation) {
        // 如果存在'relation' 属性，则将其合并到 'options.relations' 中，构建组件关系配置
        // 这里将组件关系配置以特定的格式（路径和关系对象的形式）添加到'relations' 属性中，用于后续处理组件间的关联逻辑
        options.relations = Object.assign(options.relations || {}, {
            [`../${relation.name}/index`]: relation
        });
    }

    // 如果 'options.externalClasses' 不存在（为假值），则初始化为一个空数组，用于存储组件外部可传入的类名相关配置
    options.externalClasses = options.externalClasses || [];
    // 向 'options.externalClasses' 数组中添加一个默认的类名 'custom-class'，方便外部对组件样式进行定制
    options.externalClasses.push('custom-class');

    // 如果 'options.behaviors' 不存在（为假值），则初始化为一个空数组，'behaviors' 通常用于添加混入的功能模块等
    options.behaviors = options.behaviors || [];
    // 将之前导入的 'basic' 混入对象添加到 'options.behaviors' 数组中，为组件添加基础的通用功能扩展
    options.behaviors.push(basic);

    // 如果 'vantOptions' 中存在 'field' 属性（可能表示组件与表单字段相关的某种标识）
    if (vantOptions.field) {
        // 则向 'options.behaviors' 数组中添加 'wx://form-field'（可能是指向一个表单字段相关的行为模块，用于实现表单相关功能）
        options.behaviors.push('wx://form-field');
    }

    // 为组件配置添加默认的通用选项配置
    options.options = {
        multipleSlots: true,  // 允许组件使用多个插槽，方便更灵活的内容布局和定制
        addGlobalClass: true  // 允许添加全局类名，增强样式定制的灵活性
    };

    // 使用导入的 'observe' 模块（函数），根据 'vantOptions' 来对 'options' 进行一些数据观察等相关的处理（具体功能由 'observe' 函数实现）
    observe(vantOptions, options);

    // 调用 'Component' 函数（这里假设是所在框架提供的用于注册组件的函数，比如微信小程序的组件注册机制），传入处理好的 'options' 配置对象来注册组件
    Component(options);
}

// 将 'VantComponent' 函数作为模块的导出项，以便其他模块可以引入并使用该函数来创建 Vant 风格的组件
export { VantComponent };
