/**
 * 场景：
 *
 * 1. 获取字段新增列表
 * 2. 获取关系新增列表
 * 3. 根据字段信息生成配置面板
 * 4. 根据关系信息生成配置面板
 * 5. 根据字段信息，生成 amis 配置
 * 6. 根据字段信息，生成页面配置面板
 */
import { ApiBuilder } from '../schema-builder/ApiBuilder';
import { SharedContext } from '../schema-builder/SharedContext';
import { DataSourceItem, ModelItem, FieldItem, FormSchema, FieldType, RelationType, RelationShipItem, DatabaseDialectType, MayBeSchema } from '../type';
import { PluginEventListener } from './Event';
import { Manager } from './Manager';
import type { Strategy } from '../schema-builder/ApiStrategyInterface';
export interface BuildEditDatasourceFormContext {
    data?: any;
}
export interface BuildAddModelFormContext {
    datasource: DataSourceItem;
    data?: any;
}
export interface BuildModelFormContext {
    datasource: DataSourceItem;
    model: ModelItem;
    data?: any;
}
export interface BuildAddRelationFormContext {
    datasource: DataSourceItem;
    model: ModelItem;
    data: Record<string, any>;
}
export interface BuildModelFormFieldContext {
    datasource: DataSourceItem;
    model: ModelItem;
    field: FieldItem;
    fieldType: FieldType & {
        plugin: PluginInterface;
    };
    data?: any;
    apiStrategy?: Strategy;
    apiStrategyOptions?: {
        apiPrefix?: string;
        /**
         * 是有生成 model 协议地址，如 model://dsKey.key
         */
        useApiSchema?: boolean;
    };
}
export interface BuildModelFormRelationContext {
    datasource: DataSourceItem;
    model: ModelItem;
    field: FieldItem;
    relation: RelationShipItem;
    data?: any;
}
export interface BuildFieldSchemaContext extends BuildModelFormFieldContext {
    /**
     * 给谁构建配置项
     * - er 是指模型设计器中的默认配置
     * - schema-builder 是指模型页面编辑器
     * - amis-editor 是指页面设计器
     * - embed 内嵌配置模式，通常只会修改部分属性
     * - quick-edit 是字段查看模式的
     * - nocode-form 是（零码）表单编辑器
     */
    settingFor?: 'er' | 'schema-builder' | 'amis-editor' | 'embed' | 'quick-edit' | 'scaffold' | 'nocode-form' | string;
    /**
     * 编辑字段的模式，是为了创建，还是为了更新
     * 有些字段是只能更新不能创建的
     */
    mode?: 'create' | 'update' | 'filter' | 'simple-query' | 'view' | 'quick-edit' | string;
    /**
     * 展示字段的模式，是表格里面，还是表单里面的展示
     */
    viewType?: 'table' | 'form' | 'cards' | 'list' | string;
    relation?: RelationShipItem;
    relationType?: RelationType & {
        plugin: PluginInterface;
    };
    /** 关系字段构建时的额外配置项目 */
    relationBuildConfig?: {
        /** 构建Schema时，name字段的前缀，在页面设计器模式下，关系字段配置可能放在对象中 */
        schemaNamePrefix?: string;
    };
    sharedContext?: SharedContext;
}
export type BuildFieldSchemaContextOthers = Omit<Partial<BuildFieldSchemaContext>, 'model' | 'field'>;
export interface PluginInterface extends PluginEventListener {
    readonly manager: Manager;
    /**
     * 构建数据库类型
     */
    registerDatabaseDialectType?: () => DatabaseDialectType | DatabaseDialectType[];
    /**
     * 注册字段类型
     */
    registerFieldType?: () => FieldType | FieldType[];
    /**
     * 注册关系类型
     */
    registerRelationType?: () => RelationType | RelationType[];
    /**
     * 构建新增关系表单
     */
    buildAddRelationForm?: (schema: FormSchema, context: BuildAddRelationFormContext) => void;
    /**
     * 构建模型右侧面板表单
     */
    buildModelForm?: (schema: FormSchema, context: BuildModelFormContext) => void;
    /**
     * 构建模型字段右侧面板表单
     */
    buildModelFieldForm?: (schema: FormSchema, context: BuildModelFormFieldContext) => void | Promise<void>;
    /**
     * 构建模型关系右侧面板表单
     */
    buildModelRelationForm?: (schema: FormSchema, context: BuildModelFormRelationContext) => void | Promise<void>;
    /**
     * 构建模型新增表单
     */
    buildAddModelForm?: (schema: FormSchema, context: BuildAddModelFormContext) => void;
    /**
     * 构建数据源新增表单
     */
    buildEditDatasourceForm?: (schema: FormSchema, context: BuildEditDatasourceFormContext, options: any) => void;
    /**
     * 通过当前生成的 schema 猜测字段的配置
     * @param schema
     * @param context
     * @returns
     */
    guessFieldOptionsFromSchema?: (options: Record<string, any>, context: BuildFieldSchemaContext, schema: any) => any | Promise<any>;
    /**
     * 构建字段配置表单，生成配置面板
     * @param schema
     * @param context
     * @returns
     */
    buildFieldSettingForm?: (schema: FormSchema, context: BuildFieldSchemaContext, options?: any) => void | Promise<void>;
    /**
     * 基于字段+配置，构建 amis schema
     * @param schema
     * @param context
     * @param options
     * @param ab
     * @returns
     */
    buildFieldSchema?: (schema: MayBeSchema, context: BuildFieldSchemaContext, options: {
        label?: string;
        quickEdit?: boolean;
        filterable?: boolean;
        [propName: string]: any;
    }, ab?: ApiBuilder, originSchema?: any) => void | Promise<void>;
    /**
     * 构建字段查看模式可配置的属性配置面板表单
     */
    buildFieldViewSettingForm?: (schema: FormSchema, context: BuildFieldSchemaContext) => void | Promise<void>;
    /**
     * 构建字段查看形态的 amis schema
     */
    buildFieldViewSchema?: (schema: MayBeSchema, context: BuildFieldSchemaContext, options: {
        label?: string;
        quickEdit?: boolean;
        filterable?: boolean;
        [propName: string]: any;
    }, ab?: ApiBuilder) => void | Promise<void>;
    /**
     * 构建字段编辑模式可配置的属性配置面板表单
     */
    buildFieldEditSettingForm?: (schema: FormSchema, context: BuildFieldSchemaContext) => void | Promise<void>;
    /**
     * 构建字段编辑形态的 amis schema
     */
    buildFieldEditSchema?: (schema: MayBeSchema, context: BuildFieldSchemaContext, options: {
        label?: string;
        isStatic?: boolean;
        [propName: string]: any;
    }, ab?: ApiBuilder) => void | Promise<void>;
    /**
     * 构建字段作为查询字段时可配置的属性配置面板表单
     */
    buildFieldFilterSettingForm?: (schema: FormSchema, context: BuildFieldSchemaContext) => void | Promise<void>;
    /**
     * 构建字段作为查询条件时用什么schema
     */
    buildFieldFilterSchema?: (schema: MayBeSchema, context: BuildFieldSchemaContext, options: {
        label?: string;
        searchOp?: 'eq' | 'ne' | 'gt' | 'ge' | 'lt' | 'le' | 'like' | 'sw' | 'ew' | 'bt' | 'in';
        [propName: string]: any;
    }, ab?: ApiBuilder) => void | Promise<void>;
    /**
     * 用来构建复杂查询条件中字段具体的配置。
     * 配合前端 condition-builder 一起使用
     *
     * 参考：http://aisuda.baidu-int.com/amis/zh-CN/components/form/condition-builder
     */
    buildFieldConditionFieldConfig?: (schema: MayBeSchema, context: BuildModelFormFieldContext) => Promise<any>;
    buildFXVariables?: (vairables: Array<any>) => Promise<void>;
    dispose?: () => void;
}
