import { ButtonProps, ColProps, DrawerProps, FormItemProps, FormProps, ModalProps, RowProps } from '@aplus-frontend/antdv';
import { FormItemExpose } from '@aplus-frontend/antdv/es/form/FormItem';
import { InternalNamePath, NamePath, ValidateOptions } from '@aplus-frontend/antdv/es/form/interface';
import { VNode } from 'vue';
import { LiteralUnion, Recordable } from '../type';
import { ApFormInstance } from './provider/interface';
import { BreakPointType } from './search-form/hooks/use-count-per-row';
export type { ApFormChangeInfo, ApFormFinishInfo } from './provider/interface';
export type ApFormColProps = Omit<ColProps, 'prefixCls'>;
export type ApFormItemTransformFn = (value: any, api?: Pick<ApFormInstance, 'getFieldsValue'>) => any;
export type ApFormItemTransformType = ApFormItemTransformFn | {
    transformer: ApFormItemTransformFn;
    /**
     * 是否进行扁平化处理（只向上扁平化一层）
     */
    flat?: boolean;
};
export type ApFormItemProps = FormItemProps & Partial<ApFormColProps> & {
    /**
     * 是否展示包含了输入框&label的border
     */
    bordered?: boolean;
    valuePropName?: string;
    /**
     * 表单项的默认值（只生效一次），支持传入异步函数
     */
    initialValue?: any;
    /**
     * 内部使用，请勿传入
     */
    _signal?: number;
    /**
     * 数据转换（提交/或者手动调用时才会）
     * @param value
     * @returns
     */
    transform?: ApFormItemTransformType;
    tooltip?: any;
    /**
     * 此表单项的描述，设置此信息后，在查询表单排序时将优先使用此属性值
     */
    description?: string;
    /**
     * 自定义表单是否输入值校验，用于查询表单收起表单项的输入表单数量角标显示
     * @param value
     * @returns
     */
    customFilled?: (value: any) => boolean;
    /**
     * 是否禁用，禁用时将会有特殊样式，配合bordered=true使用生效
     */
    disabled?: boolean;
    autoFocus?: boolean;
};
export type ApFormItemGroupProps = RowProps & {
    countPerRow?: number;
};
export type ApFormProps = Omit<FormProps, 'model' | 'onValuesChange'> & {
    initialValues?: Recordable;
    /**
     * 字段值更新时触发
     * @param changedValues 更改的字段值
     * @param allValues 更改后的字段值
     * @param fieldName 触发change的表单项
     * @returns
     */
    onValuesChange?: (changedValues: Recordable, allValues: Recordable, fieldName: NamePath) => void;
    /**
     * 同步表单数据到url中
     */
    syncToUrl?: boolean | ((values: Recordable, type: 'get' | 'set') => Recordable);
    /**
     * syncToUrl和initialValues合并是否优先，默认为false
     */
    syncToUrlPriority?: boolean;
    /**
     * 是否自动聚焦第一个控件（仅支持聚焦的控件）
     */
    autoFocusFirstInput?: boolean;
};
export type WatchFunc = (values?: Recordable) => void;
export type UpdateModelOptimizeFn = (currentModelValue: any, name: string | number) => void;
export type ApFormExpose<ModelType = any> = {
    setFieldsValue: (fields: Partial<ModelType>) => void;
    setFieldValue: (name: NamePath, value: any, triggerChange?: boolean, optimizeFn?: UpdateModelOptimizeFn) => void;
    resetFields: () => Promise<void>;
    clearValidate: (name?: NamePath) => void;
    validateFields: (nameList?: NamePath[] | string, options?: ValidateOptions) => Promise<Partial<ModelType>> | undefined;
    getFieldsValue: (nameList?: true | InternalNamePath[]) => Partial<ModelType> | undefined;
    validate: (nameList?: NamePath[] | string, options?: ValidateOptions) => Promise<Partial<ModelType>> | undefined;
    scrollToField: (name: NamePath, options?: any) => void;
    /**
     * 内部使用，请勿在外部通过Form实例调用
     * @param mark 内部使用的标记
     * @returns
     */
    getInternalInstance: (mark: string) => ApFormInternalInstance | undefined;
    /**
     * 校验表单并返回转换后的数据
     * @param nameList
     * @param options
     * @returns
     */
    validateFieldsReturnTransformed: (nameList?: NamePath[] | string, options?: ValidateOptions) => Promise<Partial<ModelType>> | undefined;
    /**
     * 获取表单数据并转换
     * @param nameList
     * @returns
     */
    getFieldsValueTransformed: (nameList?: true | InternalNamePath[]) => Partial<ModelType> | undefined;
    registerWatch: (callback: WatchFunc, inner: boolean) => () => void;
};
/**
 * 被注册的表单项
 */
export type RegistedFieldType = {
    name: FormItemProps['name'];
    initialValue?: any;
    transform?: ApFormItemTransformType;
};
export type ApFormInternalInstance = {
    /**
     * 注册字段watch
     * @param callback
     * @param inner
     * @returns
     */
    registerWatch: (callback: WatchFunc, inner?: boolean) => () => void;
    /**
     * 注册表单项
     * @param field
     * @returns
     */
    registerField: (field: RegistedFieldType) => void;
    /**
     * 设置表单值
     * @param name
     * @param value
     * @param triggerChange
     * @returns
     */
    setFieldValue: (name: NamePath, value: any, triggerChange?: boolean, optimizeFn?: UpdateModelOptimizeFn) => void;
    /**
     * 获取表单的初始值（随着表单项组件的注册，initialValues可能会发生改变）
     * @returns
     */
    getInitialValues: () => Recordable;
    /**
     * 更新表单的初始值（仅用于某些组件内部调用的情况）
     */
    updateInitialModel: (name: FormItemProps['name'], val: any) => void;
    /**
     * 表单校验
     */
    validateFields: ApFormExpose['validateFields'];
};
export type ApFormItemExpose = FormItemExpose & {
    /**
     * 是否需要格式化（默认为false）
     * @param shouldFormat
     * @returns
     */
    getFieldValue: (shouldFormat?: boolean) => any;
};
export type SearchFormResizeConfig = {
    target?: LiteralUnion<'document' | 'form', string>;
    breakPoint?: BreakPointType;
};
export type ApFormListProps = {
    name: FormItemProps['name'];
    /**
     * 设置FormList的默认值
     */
    initialValue?: any[];
    transform?: ApFormItemTransformType;
};
export type ApFormSearchFormProps = ApFormProps & {
    /**
     * 是否展开
     * @deprecated 已废弃
     */
    collapse?: boolean;
    /**
     * 默认情况下是否展开
     * @deprecated 已废弃
     */
    defaultCollapse?: boolean;
    /**
     * 展开关闭时的回调
     * @deprecated 已废弃
     * @param collapse
     * @returns
     */
    'onUpdate:collapse'?: (collapse?: boolean) => void;
    searchText?: string;
    resetText?: string;
    onSubmit?: (values: any) => void;
    onReset?: () => void;
    customReset?: boolean;
    extraInAction?: boolean;
    /**
     * 是否是强制展开的（即无法关闭）
     * @deprecated 已废弃
     */
    forceExpand?: boolean;
    countPerRow?: number;
    submitLoading?: boolean;
    /**
     * 最大显示的行（超出后将会收起进入更多筛选）
     */
    maxRows?: number;
    /**
     * 是否可排序
     */
    sortable?: boolean;
    /**
     * 尺寸监听目标元素（用于响应式）
     * @deprecated use `resize` instead.
     */
    resizeTarget?: HTMLElement | null;
    /**
     * 尺寸变化配置项
     * @since 6.35.3
     */
    resize?: SearchFormResizeConfig;
    /**
     * 查询按钮loading延迟（默认300ms）
     */
    loadingDelay?: number;
};
export type SearchFormRenderNodeConfig = {
    node: VNode;
    key: string;
    span: number;
};
export type ApFormSearchFormPopoverFilterProps = {
    config: SearchFormRenderNodeConfig[];
    onSubmit: () => void;
    submitLoading: boolean;
};
export type ApFormSearchFormPopoverSorterItem = {
    name: string;
    label: string;
    isHidden?: boolean;
};
export type ApFormSearchFormPopoverSorterProps = {
    /**
     * 需要排序的节点对象
     */
    items: ApFormSearchFormPopoverSorterItem[];
    /**
     * 点击确定
     * @param sortedChildren
     * @returns
     */
    onClickConfirm: (sortedChildren: ApFormSearchFormPopoverSorterItem[]) => void;
    /**
     * 当前的children是否已经排序过了
     */
    sorted?: boolean;
};
export type ApFormSearchFormExpose = {
    apForm: ApFormExpose;
    /**
     * 获取排序结果
     * @returns
     */
    getSorterItems: () => ApFormSearchFormPopoverSorterItem[];
    /**
     * 设置排序结果
     * @param sortedItems
     * @returns
     */
    setSorterItems: (sortedItems: ApFormSearchFormPopoverSorterItem[]) => void;
    /**
     * 重设查询表单排序
     */
    resetSorterItems: () => void;
};
export type ApFormSubmitterConfig = {
    submitText?: string;
    resetText?: string;
    onSubmit?: () => void;
    onReset?: () => void;
    submitButtonProps?: false | Partial<ButtonProps>;
    resetButtonProps?: false | Partial<ButtonProps>;
};
export type ApFormModalFormProps = Omit<ApFormProps, 'onFinish'> & {
    open?: boolean;
    'onUpdate:open'?: (open: boolean) => void;
    modalProps?: Omit<ModalProps, 'open' | 'onUpdate:open' | 'visible'>;
    title?: string;
    width?: number;
    onFinish?: (values: any) => Promise<boolean>;
    submitter?: false | ApFormSubmitterConfig;
    showCancel?: boolean;
    /**
     * 提交超时时间
     */
    submitTimeout?: number;
};
export type CustomizeResizeType = {
    onResize?: (_size: number) => void;
    maxWidth?: DrawerProps['width'];
    minWidth?: DrawerProps['width'];
    resizeOnOpen?: boolean;
};
export type ApFormDrawerFormProps = Omit<ApFormProps, 'onFinish'> & {
    open?: boolean;
    'onUpdate:open'?: (open: boolean) => void;
    drawerProps?: Omit<DrawerProps, 'open' | 'onUpdate:open'>;
    title?: DrawerProps['title'];
    width?: DrawerProps['width'];
    onFinish?: (values: any) => Promise<boolean>;
    submitter?: false | ApFormSubmitterConfig;
    showCancel?: boolean;
    /**
     * 提交超时时间
     */
    submitTimeout?: number;
    /**
     * 可拖动改变drawer的尺寸
     */
    resize?: CustomizeResizeType | boolean;
};
export type ApFormModalFormExpose = Omit<ApFormExpose, 'registerWatch'>;
export type ApFormDrawerFormExpose = ApFormModalFormExpose;
/**
 * ApFormItem支持的插槽
 */
export type ApFormItemSlots = {
    help?: any;
    label?: any;
    extra?: any;
    default: () => VNode[];
};
export type ApFormDependencyProps = {
    nameList: NamePath[];
};
export type ApFormSetProps = {
    /**
     * 需要聚合成的字段名
     */
    name: NamePath;
    /**
     * 聚合成（数组/对象）
     */
    as?: 'array' | 'object';
    /**
     * 默认值
     */
    initialValue?: any;
    /**
     * 转换函数（表单提交时触发）
     * @param value
     * @returns
     */
    transform?: ApFormItemTransformType;
};
export type ApFormControlRenderProps = {
    value?: any;
    'onUpdate:value'?: (value: any, ...args: any[]) => void;
    bordered?: boolean;
    onFocus?: () => void;
    onBlur?: () => void;
    [key: string]: any;
};
export type ApFormItemRenderProps = ApFormItemProps;
