import { ExtractPublicPropTypes } from 'vue';
import { FormItemRuleValidator as FormRuleValidator } from 'naive-ui/lib/form/src/interface';
import { datePickerProps } from 'naive-ui';
/**
 * 表单校验类型
 */
export type HValidateType = 'string' | 'number' | 'boolean' | 'method' | 'regexp' | 'integer' | 'float' | 'array' | 'object' | 'enum' | 'date' | 'url' | 'hex' | 'email' | 'pattern' | 'any';
/**
 * 表单组件类型
 */
export type HFormCompType = 'Input' | 'InputNumber' | 'Select' | 'TreeSelect' | 'RadioButtonGroup' | 'RadioGroup' | 'Radio' | 'Checkbox' | 'CheckboxGroup' | 'AutoComplete' | 'Cascader' | 'DatePicker' | 'Switch' | 'Upload' | 'Slider' | 'Rate' | 'Tree' | 'Transfer' | 'Slot' | 'TimePicker';
export interface HFormRule {
    /**
     * 表单字段名
     */
    field: string;
    /**
     * 标签名称
     */
    label?: string;
    /**
     * 标签对齐方式
     */
    labelAlign?: 'left' | 'center' | 'right';
    /**
     * 是否必填项
     */
    required?: boolean | ((fApi: HFormApi) => boolean);
    /**
     * 组件类型
     */
    compType: HFormCompType | ((fApi: HFormApi) => HFormCompType);
    /**
     * 校验事件
     */
    trigger?: string | string[];
    /**
     * 验证错误提示消息
     */
    message?: string;
    /**
     * 24栅格暂用的空间大小
     */
    span?: number | (() => number);
    /**
     * 默认值
     */
    defaultValue?: any;
    /**
     * 标签的宽度
     */
    labelWidth?: number | string;
    /**
     * 数据类型校验
     */
    validateType?: HValidateType;
    /**
     * 表单校验
     */
    validator?: FormRuleValidator;
    /**
     * 是否填充整个宽度
     */
    fullWidth?: boolean;
    /**
     * 忽略表单提交
     */
    ignoreCommit?: boolean;
    /**
     * 是否重置数据
     */
    restValue?: boolean;
    /**
     * 是否显示
     */
    show?: boolean | ((fApi: HFormApi) => boolean);
    /**
     * 组件参数
     */
    props?: object | ((fApi: HFormApi) => object);
    /**
     *  当组件类型为：RadioGroup RadioButtonGroup ,Select的选项内容
     */
    options?: Array<{
        label?: string;
        value?: any;
        [key: string]: any;
    }> | ((fApi: HFormApi) => Array<{
        label?: string;
        value?: any;
        [key: string]: any;
    }>);
    /**
     * 组件加载钩子函数
     * @param params 表单相关操作参数
     * @returns
     */
    onLoad?: (fApi: HFormApi) => any;
    /**
     * 是否禁用
     */
    disabled?: boolean | ((fApi: HFormApi) => boolean);
    /**
     * 组件模式，edit编辑模式，text：文本模式
     */
    mode?: 'edit' | 'text';
}
export interface HFormApi {
    /**
     * 表单数据
     */
    formData: Record<string, any>;
    /**
     * 设置表单数据
     * @param formData
     * @returns
     */
    setFormData: (formData: Record<string, any>) => void;
    /**
     * 设置表单数据
     * @param field
     * @param value
     * @returns
     */
    setValue: (field: string, value: any) => Promise<any>;
    /**
     * 设置表单数据
     * @param values
     * @returns
     */
    setValues: (values: Record<string, any>) => Promise<any>;
    /**
     * 设置表单规则
     * @param field
     * @param rule
     * @returns
     */
    setRule: (field: string, rule: HFormRule) => HFormRule;
    /**
     * 获取表单规则
     *
     * @param field
     * @returns
     */
    getRule: (field: string) => HFormRule | undefined;
    /**
     * 合并表单规则
     * @param field
     * @param rule
     * @returns
     */
    mergeRule: (field: string, rule: HFormRule) => HFormRule;
    /**
     * 设置表单数据选择项
     * @param field
     * @param options
     * @returns
     */
    setOptions: (field: string, options: Array<{
        label?: string;
        value?: any;
        [key: string]: any;
    }>) => Promise<any>;
    /**
     * 校验表单
     * @returns
     */
    validate: () => Promise<Record<string, any>>;
    /**
     * 触发搜索
     * @param formData
     * @returns
     */
    search: (formData?: Record<string, any>) => void;
    /**
     * 重置表单
     * @returns
     */
    reset: () => void;
    /**
     * 表单规则
     */
    rules: HFormRule[];
    /**
     * 表单数据
     */
    value?: any;
    /**
     * 表单规则
     */
    rule?: HFormRule;
}
/**
 * 日期选择器组件参数
 */
export type HDatePickerFormProps = ExtractPublicPropTypes<typeof datePickerProps> & {
    rangeMappingToFields?: [string, string];
    valDateFormat?: 'YYYY-MM-DD HH:mm:ss' | 'YYYY-MM-DD' | 'HH:mm:ss';
    /**
     *  处理日期区间选择，结束时间时间戳，由于组件的bug导致，结束的时间戳是当天的开始时间，导致筛选数据异常
     * eg: 组件原始数据：[2024-01-01,2024-01-01]对应时间戳为 [1672531200000,1672531200000]
     * 处理后为 [2024-01-01,2024-01-02]应该为2024-01-01 00:00:00 到 2024-01-02 23:59:59 时间戳为 [1672531200000,1672535999999]
     */
    rangeEndTimeStamp?: boolean;
};
