import { TAny, TPlainObject } from '@flatbiz/utils';
import { DatePicker, FormItemProps, FormListFieldData, FormListOperation, GetProps, InputNumberProps, InputProps, PopoverProps, RadioGroupProps, SelectProps, SwitchProps, TableProps, TooltipProps, UploadFile, UploadProps } from 'antd';
import { CheckboxGroupProps } from 'antd/lib/checkbox/index.js';
import { FormListProps } from 'antd/lib/form/index.js';
import { TextAreaProps } from 'antd/lib/input/index.js';
import { ColumnsType } from 'antd/lib/table/index.js';
import { UploadChangeParam } from 'antd/lib/upload/index.js';
import { CSSProperties, ReactElement, ReactNode } from 'react';

export type TipsWrapperProps = {
	gap?: number;
	className?: string;
	style?: CSSProperties;
	children?: ReactNode;
	icon?: ReactElement;
	/** Icon添加点击事件，设置hoverTips后失效 */
	onClick?: (event: any) => void;
	/**
	 * 提示效果类型
	 * ```
	 * 1. popover 气泡卡片，内容通过popoverProps设置
	 * 2. tooltip 文字提示，内容通过tooltipProps设置
	 * ```
	 */
	tipType?: "popover" | "tooltip";
	popoverProps?: PopoverProps;
	tooltipProps?: TooltipProps;
	trigger?: "icon" | "all";
};
export type TDayjsDateType = "YYYY-MM-DD HH:mm:ss" | "YYYY-MM-DD HH:mm" | "YYYY-MM-DD HH" | "YYYY-MM-DD" | (string & {});
export type DatePickerType = GetProps<typeof DatePicker>;
export type DatePickerWrapperProps = Omit<DatePickerType, "value" | "onChange" | "format" | "picker"> & {
	/** 默认格式为 'YYYY-MM-DD' */
	value?: string;
	onChange?: (value?: string) => void;
	disabledDateConfig?: {
		minDate?: TDayjsDateType;
		maxDate?: TDayjsDateType;
		/** 禁用 小时 刻度列表，与日期无关  */
		disabledHourList?: number[];
		/** 禁用 分钟 刻度列表，与日期无关 */
		disabledMinuteList?: number[];
		/** 禁用 秒钟 刻度列表，与日期无关 */
		disabledSecondList?: number[];
	};
	/** 可自定义格式 */
	format?: TDayjsDateType;
	/** value 输出适配 */
	outputNormalize?: (value?: TAny) => TAny;
	/** value 输入适配 */
	inputNormalize?: (value?: TAny) => string | undefined;
};
export type DateRangePickerType = GetProps<typeof DatePicker.RangePicker>;
export type DateRangePickerWrapperProps = Omit<DateRangePickerType, "value" | "onChange" | "onCalendarChange" | "format" | "picker"> & {
	value?: [
		string,
		string
	];
	onChange?: (value?: [
		string,
		string
	]) => void;
	/**
	 * 1. minDate、maxDate 与 format格式相同；默认：YYYY-MM-DD
	 * 2. maxDays 最大可选的天数
	 */
	disabledDateConfig?: {
		minDate?: TDayjsDateType;
		maxDate?: TDayjsDateType;
		maxDays?: number;
		/** 禁用 小时 刻度列表，与日期无关  */
		disabledHourList?: number[];
		/** 禁用 分钟 刻度列表，与日期无关 */
		disabledMinuteList?: number[];
		/** 禁用 秒钟 刻度列表，与日期无关 */
		disabledSecondList?: number[];
	};
	format?: TDayjsDateType;
	/** value 输出适配 */
	outputNormalize?: (value: [
		string,
		string
	]) => TAny;
	/** value 输入适配 */
	inputNormalize?: (value?: TAny) => [
		string,
		string
	] | undefined;
};
export type TRequestStatus = "request-init" | "request-progress" | "request-success" | "request-error" | "request-search-keyword-empty" | "no-dependencies-params";
export type TRequestStatusProps = {
	status?: TRequestStatus;
	errorButton?: ReactElement;
	messageConfig?: Partial<Record<TRequestStatus, string>>;
	loading?: boolean;
};
export type SelectorWrapperValue = string | number | Array<string | number> | TPlainObject<string | number> | Array<TPlainObject<string | number>>;
export type SelectorServiceConfig = {
	params?: TPlainObject;
	/** 与 params 配合使用 */
	requiredParamsKeys?: string[];
	onRequest?: (params?: TAny) => Promise<TAny>;
	/**
	 * 响应数据适配器
	 */
	onRequestResultAdapter?: (respData: TAny) => TPlainObject[];
};
export type SelectorWrapperProps = Omit<SelectProps, "onSearch" | "notFoundContent" | "options" | "fieldNames" | "onChange" | "value" | "loading" | "mode"> & {
	/** 不支持 tags 模式，tags模式请使用 SelectorWrapperSimple 组件 */
	mode?: "multiple";
	/**
	 * 设置请求唯一值
	 * ```
	 * 1. 设置后，如果请求入参不变，不会重复请求接口，直接使用上次缓存数据
	 * ```
	 */
	modelKey?: string;
	/**
	 * 参数Key映射
	 * ```
	 * 1. 默认值：value=value、label=label、disabled=disabled
	 * 2. list 为 onRequest 返回数据中列表key值，可多级取值，例如： 'a.b.c'
	 * 3. 配置 serviceConfig.onRequestResultAdapter后，fieldNames.list配置失效
	 * 4. 如果没有配置list，可说明接口返回为数组
	 * ```
	 */
	fieldNames?: {
		list?: string;
		label?: string;
		value?: string;
		disabled?: string;
	};
	/**
	 * 请求服务需求的数据
	 */
	serviceConfig?: SelectorServiceConfig;
	/**
	 * 同步设置选择器选项列表
	 * ```
	 * 1. 如果配置fieldNames，会转换后使用
	 * 2. 值为undefined、null不会更新，需要清空可传递空数组
	 * ```
	 */
	selectorList?: TPlainObject[];
	/**
	 * select 数据源发生变更时触发，第一次不调用
	 */
	onSelectorListChange?: (dataList: TPlainObject[]) => void;
	/** select 数据源发生变更时触发，每次都会调用 */
	onSelectorListAllChange?: (dataList: TPlainObject[]) => void;
	/**
	 * 通过服务获取数据异常回调
	 */
	onSelectorRequestError?: (error: Error) => void;
	/**
	 * 添加全部选项
	 * ```
	 * 1. 默认值label="全部"，value=""
	 * 2. 可配置label、value
	 * ```
	 */
	showAllOption?: true | {
		label: string;
		value: string | number;
	};
	onLabelRenderAdapter?: (dataItem: TPlainObject) => string | ReactElement;
	onChange?: (value?: SelectorWrapperValue, selectedList?: TPlainObject[] | TPlainObject) => void;
	showIcon?: boolean;
	/** select option添加图标；与showIcon组合使用 */
	icon?: (data: TPlainObject, index: number) => ReactElement;
	requestMessageConfig?: TRequestStatusProps["messageConfig"];
	/**
	 * value格式
	 *```
	 * 1. string 、number
	 * 2. Array<string | number>
	 * 3. lableInValue = true，根据fieldNames配置格式
	 * 4. lableInValue = true，Array<fieldNames配置>
	 * ```
	 */
	value?: SelectorWrapperValue;
	/**
	 * 使用缓存，默认值：true
	 * ```
	 * 1. true: 在 modelKey下使用请求参数缓存数据，如果相同modelKey、相同请求参数直接使用缓存数据
	 * 2. false: 每次都调用接口，不参与缓存数据、不使用缓存数据
	 * 3. useCache=false 在 serviceConfig.requiredParamsKeys.length > 0 有效
	 *
	 * @deprecated 已废弃
	 *
	 * ```
	 * 1. 需要缓存设置 modelKey，不需要不设置
	 * ```
	 */
	useCache?: boolean;
	/** 是否显示刷新图标 */
	showRefreshIcon?: boolean;
};
export type SwitchWrapperValue = string | number | boolean;
export type SwitchWrapperProps = Omit<SwitchProps, "checked" | "defaultChecked" | "onChange" | "value"> & {
	value?: SwitchWrapperValue;
	checkedValue: SwitchWrapperValue;
	unCheckedValue: SwitchWrapperValue;
	onChange?: (value: SwitchWrapperValue) => void;
	tooltipProps?: Omit<TooltipProps, "title">;
	tooltipTitle?: string | ((value?: SwitchWrapperValue) => string | undefined);
	serviceConfig?: {
		onRequest: (value: SwitchWrapperValue) => TAny;
		message?: {
			success?: string;
			defaultError?: string;
		};
	};
};
export type UploadWrapperProps<T extends TPlainObject = TPlainObject> = {
	value?: T[] | T;
	onChange?: (value?: T[]) => void;
	onUploadError?: (message?: string) => void;
	onUploadChange?: (info: UploadChangeParam<UploadFile>) => void;
	/**
	 * 属性取值映射
	 */
	fieldNames?: {
		uid: string;
		name?: string;
		url?: string;
		/** 文件大小 */
		size?: string | number;
	};
	/**
	 * 接口响应数据适配器，如果配置了fieldNames，适配器返回值会再进过fieldNames转换
	 */
	onRequestResultAdapter?: (respData: TAny) => TPlainObject;
	/** 操作触发显示文本 */
	triggerText?: string;
	/** 超过maxCount 隐藏上传入口  */
	limitHidden?: boolean;
	/**
	 * 自动提交，默认：true
	 * ```
	 * 1. 自定义beforeUpload配置后 autoSubmit 失效
	 * 2. 设置为 false 时，在onChange中获取File对象数组
	 * ```
	 */
	autoSubmit?: boolean;
	/** 图片预览开关, 重写 onPreview 方法后失效 */
	imagePreviewSwitch?: boolean;
	/** 图片预览文件类型，默认：['png', 'jpg', 'jpeg', 'gif', 'heic', 'heif'] */
	imagePreviewAccept?: string[];
	/**
	 * 配置文件额外操作
	 * ```
	 * 额外操作超过两项后，listType为 picture-card、picture-circle 时会出现显示异常，需要自行修改覆盖样式
	 * ```
	 */
	extraOperate?: {
		icon: ReactElement;
		onClick: (file: UploadFile, fileList: UploadFile[], e: any) => void;
	}[];
	/** 是否使用拖拽上传 */
	isDragger?: boolean;
} & Omit<UploadProps, "onChange" | "fileList">;
export type EditableTableName = string | number | Array<string | number>;
export type EditableTableRecordType = FormListFieldData & {
	operation: FormListOperation;
};
export type EditableInputConfig = {
	type: "input";
	editableComptProps?: InputProps;
};
export type EditableInputNumberConfig = {
	type: "inputNumber";
	editableComptProps?: InputNumberProps;
};
export type EditableSelectWrapperConfig = {
	type: "selectorWrapper";
	editableComptProps: SelectorWrapperProps;
};
export type EditableDatePickerWrapperConfig = {
	type: "datePickerWrapper";
	editableComptProps?: DatePickerWrapperProps;
};
export type EditableDateRangePickerWrapperConfig = {
	type: "dateRangePickerWrapper";
	editableComptProps?: DateRangePickerWrapperProps;
};
export type EditableCheckboxGroupConfig = {
	type: "checkboxGroup";
	editableComptProps: CheckboxGroupProps;
};
export type EditableRadioGroupConfig = {
	type: "radioGroup";
	editableComptProps: RadioGroupProps;
};
export type EditableTextareaConfig = {
	type: "textArea";
	editableComptProps: TextAreaProps;
};
export type EditableFileUploadConfig = {
	type: "uploadWrapper";
	editableComptProps: UploadWrapperProps;
};
export type EditableSwitchWrapperConfig = {
	type: "switchWrapper";
	editableComptProps: SwitchWrapperProps;
};
/**
 * 自定义编辑组件
 * ```
 * 1.需要处理Form.Item
 * 2. 例如
 *  editableConfig: {
	  type: 'custom',
	  editableComptProps: (props) => {
		return (
		  <Form.Item name={props.name}>
			<Input />
		  </Form.Item>
		);
	  },
	},
	```
 */
export type EditableCustomConfig = {
	type: "custom";
	editableComptProps: (props: {
		name: Array<number | string>;
		editable?: boolean;
		completeName: Array<number | string>;
		tableRowIndex: number;
	}) => ReactElement;
};
export type EditableTypeConfig = EditableCustomConfig | EditableInputConfig | EditableSelectWrapperConfig | EditableDatePickerWrapperConfig | EditableDateRangePickerWrapperConfig | EditableCheckboxGroupConfig | EditableTextareaConfig | EditableInputNumberConfig | EditableRadioGroupConfig | EditableFileUploadConfig | EditableSwitchWrapperConfig;
export type FieldSingleConfig = {
	editable?: boolean | ((data: {
		tableRowIndex: number;
	}) => boolean);
	editableConfig?: EditableTypeConfig;
	/**
	 * 当editableConfig type=custom时，此配置无效
	 */
	formItemProps?: Omit<FormItemProps, "name">;
	/**
	 * 自定义非编辑渲染
	 * 1. 当editableConfig type=custom时，此配置无效
	 * 2. 只在editable=false的情况下有效
	 * 3. 同级配置 editableConfigList后，同级render配置失效
	 * 4. checkboxGroup、radioGroup、selectorWrapper第二次参数为options数组
	 */
	render?: (params?: TAny, other?: TAny) => ReactNode;
};
export type FormListItemMethodOperateProps = {
	tableRowIndex: number;
	add: FormListOperation["add"];
	remove: () => void;
	formListItemIndex: number;
	value: TAny;
};
export type FormListMethodOperateProps = {
	tableRowIndex: number;
	add: FormListOperation["add"];
	value: TAny;
};
export type FormListConfig = {
	editableConfigList: Array<FieldSingleConfig & {
		fieldName: string;
	}>;
	onFormListBeforeRender?: (data: FormListMethodOperateProps) => ReactElement | null;
	onFormListAfterRender?: (data: FormListMethodOperateProps) => ReactElement | null;
	onFormListItemBeforeRender?: (data: FormListItemMethodOperateProps) => ReactElement | null;
	onFormListItemAfterRender?: (data: FormListItemMethodOperateProps) => ReactElement | null;
	deleteOperateRender?: (data: {
		remove: () => void;
		formListItemIndex: number;
	}) => ReactElement;
};
export type fieldConfigFunctionParams = {
	tableRowIndex: number;
	name: EditableTableName;
	tableRowName: EditableTableName;
	getTableRowData: () => TPlainObject;
};
/**
 * antd 默认render功能此处不能使用
 */
export type EditableTableColumn = Omit<ColumnsType["0"], "render"> & {
	/**
	 * @description 请使用 tipsWrapperProps 属性配置
	 * ```
	 * 会在 title 之后展示一个 icon，hover 之后提示一些信息
	 * 1. title为string类型、ReactElement有效
	 * 2. hoverArea 默认值：icon
	 * ```
	 */
	/**
	 * 会在 title 之后展示一个 icon
	 * ```
	 * 1. title为string类型有效
	 * 2. 可为icon添加提示效果
	 * 3. 可为icon添加点击事件
	 *
	 * 例如
	 * tipsWrapperProps: {
	 *  tipType: 'tooltip',
	 *  tooltipProps: {
	 *    title: '我是内容',
	 *  },
	 * }
	 *
	 * tipsWrapperProps: {
	 *    tipType: 'popover',
	 *    popoverProps: {
	 *      title: '我是标题',
	 *      content: '我是内容',
	 *    },
	 *  },
	 * ```
	 */
	tipsWrapperProps?: string | TipsWrapperProps;
	dataIndex?: string;
	fieldConfig?: FieldSingleConfig | FormListConfig | ((data: fieldConfigFunctionParams) => FieldSingleConfig | FormListConfig);
	/** 隐藏域字段 */
	hiddenField?: {
		dataIndex: string;
	} | {
		dataIndex: string;
	}[];
	/**
	 * 渲染中间件，如果renderMiddleware返回值为ReactElement格式，则会终止后续逻辑，fieldConfig配置将失效
	 * ```
	 * 1. tableRowIndex: 当前row的索引值
	 * 2. name: 当前table单元格的form.item的name值
	 * 3. operation Form.List的操作函数
	 * 4. 对 table children column渲染无效
	 * ```
	 */
	renderMiddleware?: (item: {
		tableRowIndex: number;
		name: EditableTableName;
		tableRowName: EditableTableName;
		operation: FormListOperation;
		index: number;
		getTableRowData: () => TPlainObject;
	}) => ReactElement | null;
	/** table datasource children column 自定义渲染  */
	tableChildrenColumnRender?: (value: TAny, record: TPlainObject, index: number) => ReactElement | null;
	/** 为表格header中的字段添加必填标识，无验证拦截功能 */
	required?: boolean;
};
export type EditableTableProps = {
	/** FormList name属性 */
	name: EditableTableName;
	/**
	 * 当前Edittable处在formList内部时（必填），完整formItem的name
	 * ```
	 * 例如 处在formList内部
	 * 1. name=[0,dataList]
	 * 2. completeName=[xxxList, 0, dataList]
	 * ```
	 */
	completeName?: Array<string | number>;
	/**
	 * 表格行数据，唯一值字段Key
	 * ```
	 * 1. 如果数据中没有可前端添加key
	 * 2. 有问题可咨询 xg15472
	 * ```
	 */
	uidFieldKey: string;
	/**
	 * ```
	 * antd table属性
	 * 1. 新增cellVerticalAlign，单元格竖直方向对齐方式，设置table column onCell属性后失效
	 * ```
	 */
	tableProps?: Omit<TableProps<EditableTableRecordType>, "dataSource" | "columns" | "rowKey"> & {
		cellVerticalAlign?: "baseline" | "middle" | "top" | "bottom";
	};
	columns: EditableTableColumn[];
	onTableBeforeRender?: (formListOperation: FormListOperation, nextRowIndex: number) => ReactElement | null;
	/**
	 * 设置后，将覆盖底部`新增`按钮
	 */
	onTableAfterRender?: (formListOperation: FormListOperation, nextRowIndex: number) => ReactElement | null;
	/** 新增行默认值，自定义onTableAfterRender后失效 */
	getAddRowDefaultValues?: () => TPlainObject;
	/** 隐藏底部`新增`按钮，设置 onTableAfterRender后 失效 */
	hiddenFooterBtn?: boolean;
	/**
	 * Form.List rules
	 * ```
	 rules={[
		{
		  validator: async (_, names) => {
			if (!names || names.length < 2) {
			  return Promise.reject(new Error('At least 2 passengers'));
			}
		  },
		},
	  ]}
	 * ```
	 */
	rules?: FormListProps["rules"];
	/** 空效果显示尺寸，默认值：small */
	emptyShowSize?: "small" | "large";
	className?: string;
	style?: CSSProperties;
};
export type DragEditableTableProps = EditableTableProps & {
	/**
	 * 拖拽图标自定义，默认使用 DragOutlined 图标
	 */
	dragIcon?: ReactElement;
	/** 禁用拖拽 */
	disabledDrag?: boolean;
	/**
	 * 表格数据唯一值字段Key
	 * ```
	 * ```
	 */
	uidFieldKey: string;
	/**
	 * 拖拽结束事件
	 * ```
	 * dataSource: 拖拽完成后的数据源
	 * dragData
	 * 1. activeId 拖拽ID
	 * 2. activeIndex 拖拽起始表格数组索引值
	 * 3. overIndex 拖拽结束表格数组索引值
	 * ```
	 */
	onDragChange?: (dataSource: TPlainObject[], dragData: {
		activeId: string | number;
		overId?: string | number;
		activeIndex: number;
		overIndex: number;
	}) => void;
};
/**
 * 可拖拽编辑表格
 * @deprecated 已过期，请使用 DragEditableTablePro组件
 * ```
 * 1. 表格数据必须要有唯一值字段，通过参数 uidFieldKey 告诉组件
 * 2. Table 参数 components.body.row 被组件内部使用
 * ```
 */
export declare const DragEditableTable: (props: DragEditableTableProps) => import("react").JSX.Element;

export {};
