import { NullValue } from '@yanzhen-libs/utils';
import { ComponentPublicInstance, SetupContext, VNode, VNodeRef } from 'vue';
import { ColProps } from '../../col';
import { RowProps } from '../../row';
import { FormItemProps } from '../../form-item';
import { FormProps } from '../../form';
import { AntUseForm } from '../../form/src/hooks/use-form';
import { UnwrapRefs } from '@yanzhen-libs/utils-vue';
import { SchemaConfig } from '@yanzhen-lowcode/core';
export type FormProviderModel = {
    [field: string]: any;
};
export interface FormProviderItemColProps extends Omit<ColProps, 'span'> {
    span: string | number | ColProps['span'];
}
export interface FormProviderRolProps extends RowProps, Omit<ColProps, keyof RowProps> {
    col?: Partial<FormProviderItemColProps>;
}
export type FormProviderFieldItemProps = FormItemProps;
export interface FormProviderSchemaProps extends Omit<FormProps, 'model'> {
    model: FormProviderModel;
}
export interface FormProviderFieldProps extends FormProviderSchemaProps, Omit<FormItemProps, keyof FormProviderSchemaProps> {
    item?: Partial<FormItemProps>;
}
export interface FormProviderBaseBody {
    type: string | VNode;
    props?: Record<string, any>;
    events?: Record<string, any>;
    use?: boolean;
    draggable?: boolean | Record<string, any>;
    readOnly?: boolean;
    hidden?: boolean;
    visible?: boolean;
    field?: FormProviderFieldProps;
    col?: FormProviderItemColProps;
    body?: ProviderBodyFn<FormProviderBody | VNode | NullValue<void>>;
}
export type FormProviderBody = FormProviderBaseBody;
type ProviderBodyFn<T> = T | T[] | (() => T | T[]);
export interface FormProviderBaseSchema extends Omit<FormProviderBaseBody, 'col' | 'body' | 'props'> {
    preview?: boolean;
    readOnly?: boolean;
    grid?: boolean;
    row?: FormProviderRolProps;
    ref?: VNodeRef | VNodeRef[];
    props?: Partial<FormProviderSchemaProps>;
    body?: ProviderBodyFn<FormProviderBody | VNode | NullValue<void>>;
}
export interface FormProviderSchema extends Omit<FormProviderBaseSchema, 'row'> {
    row?: boolean | FormProviderRolProps;
}
export type AntUseFormProps = UnwrapRefs<AntUseForm>;
export interface FormProviderSchemaOptions extends Omit<AntUseFormProps, 'modelRef' | 'rulesRef'> {
    model?: FormProviderFieldProps['model'];
    rules?: FormProviderFieldProps['rules'];
    slots?: SetupContext['slots'];
    emit?: SetupContext['emit'];
    fields?: any;
    row?: Partial<FormProviderRolProps>;
    form?: Partial<FormProviderFieldProps>;
    rowSchema?: SchemaConfig;
    formSchema?: SchemaConfig;
    useModelValue?: boolean;
    [option: string]: any;
}
export type FormProviderRefInstance = ComponentPublicInstance | Element | null;
export {};
