/// <reference types="react" />

import * as React from 'react';

export interface ItemProps extends React.HTMLAttributes<HTMLElement> {
    /**
     * 样式前缀
     */
    prefix?: string;

    /**
     * label 标签的文本
     */
    label?: React.ReactNode;

    /**
     * label 标签布局，通 `<Col>` 组件，设置 span offset 值，如 {span: 8, offset: 16}，该项仅在垂直表单有效
     */
    labelCol?: {};

    /**
     * 需要为输入控件设置布局样式时，使用该属性，用法同 labelCol
     */
    wrapperCol?: {};

    /**
     * 自定义提示信息，如不设置，则会根据校验规则自动生成.
     */
    help?: React.ReactNode;

    /**
     * 额外的提示信息，和 help 类似，当需要错误信息和提示文案同时出现时，可以使用这个。 位于错误信息后面
     */
    extra?: React.ReactNode;

    /**
     * 校验状态，如不设置，则会根据校验规则自动生成
     */
    validateState?: 'error' | 'success' | 'loading';

    /**
     * 配合 validateState 属性使用，是否展示 success/loading 的校验状态图标, 目前只有Input支持
     */
    hasFeedback?: boolean;

    /**
     * 自定义内联样式
     */
    style?: React.CSSProperties;

    /**
     * node 或者 function(values)
     */
    children?: React.ReactNode | (() => void);

    /**
     * 单个 Item 的 size 自定义，优先级高于 Form 的 size, 并且当组件与 Item 一起使用时，组件自身设置 size 属性无效。
     */
    size?: 'large' | 'small' | 'medium';

    /**
     * 标签的位置
     */
    labelAlign?: 'top' | 'left' | 'inset';

    /**
     * 标签的左右对齐方式
     */
    labelTextAlign?: 'left' | 'right';

    /**
     * 扩展class
     */
    className?: string;

    /**
     * [表单校验] 不能为空
     */
    required?: boolean;

    /**
     * required 的星号是否显示
     */
    asterisk?: boolean;

    /**
     * required 自定义错误信息
     */
    requiredMessage?: string;

    /**
     * required 自定义触发方式
     */
    requiredTrigger?: string | Array<any>;

    /**
     * [表单校验] 最小值
     */
    min?: number;

    /**
     * [表单校验] 最大值
     */
    max?: number;

    /**
     * min/max 自定义错误信息
     */
    minmaxMessage?: string;

    /**
     * min/max 自定义触发方式
     */
    minmaxTrigger?: string | Array<any>;

    /**
     * [表单校验] 字符串最小长度 / 数组最小个数
     */
    minLength?: number;

    /**
     * [表单校验] 字符串最大长度 / 数组最大个数
     */
    maxLength?: number;

    /**
     * minLength/maxLength 自定义错误信息
     */
    minmaxLengthMessage?: string;

    /**
     * minLength/maxLength 自定义触发方式
     */
    minmaxLengthTrigger?: string | Array<any>;

    /**
     * [表单校验] 字符串精确长度 / 数组精确个数
     */
    length?: number;

    /**
     * length 自定义错误信息
     */
    lengthMessage?: string;

    /**
     * length 自定义触发方式
     */
    lengthTrigger?: string | Array<any>;

    /**
     * 正则校验
     */
    pattern?: any;

    /**
     * pattern 自定义错误信息
     */
    patternMessage?: string;

    /**
     * pattern 自定义触发方式
     */
    patternTrigger?: string | Array<any>;

    /**
     * [表单校验] 四种常用的 pattern
     */
    format?: 'number' | 'email' | 'url' | 'tel';

    /**
     * format 自定义错误信息
     */
    formatMessage?: string;

    /**
     * format 自定义触发方式
     */
    formatTrigger?: string | Array<any>;

    /**
     * [表单校验] 自定义校验函数
     */
    validator?: () => void;

    /**
     * validator 自定义触发方式
     */
    validatorTrigger?: string | Array<any>;

    /**
     * 是否修改数据时自动触发校验
     */
    autoValidate?: boolean;
}

export class Item extends React.Component<ItemProps, any> {}

interface HTMLAttributesWeak extends React.HTMLAttributes<HTMLElement> {
    onClick?: any;
}

export interface SubmitProps extends HTMLAttributesWeak {
    /**
     * 按钮的类型
     */
    type?: 'primary' | 'secondary' | 'normal';

    /**
     * 按钮的尺寸
     */
    size?: 'small' | 'medium' | 'large';

    /**
     * 按钮中 Icon 的尺寸，用于替代 Icon 的默认大小
     */
    iconSize?:
        | 'xxs'
        | 'xs'
        | 'small'
        | 'medium'
        | 'large'
        | 'xl'
        | 'xxl'
        | 'xxxl';

    /**
     * 当 component = 'button' 时，设置 button 标签的 type 值
     */
    htmlType?: 'submit' | 'reset' | 'button';

    /**
     * 设置标签类型
     */
    component?: 'button' | 'a';

    /**
     * 设置按钮的载入状态
     */
    loading?: boolean;

    /**
     * 是否为幽灵按钮
     */
    ghost?: true | false | 'light' | 'dark';

    /**
     * 是否为文本按钮
     */
    text?: boolean;

    /**
     * 是否为警告按钮
     */
    warning?: boolean;

    /**
     * 是否禁用
     */
    disabled?: boolean;

    /**
     * 点击提交后触发
     */
    onClick?: (value: {}, errors: {}, field: any) => void;

    /**
     * 是否校验/需要校验的 name 数组
     */
    validate?: boolean | Array<any>;

    /**
     * 自定义 field (在 Form 内不需要设置)
     */
    field?: {};
}

export class Submit extends React.Component<SubmitProps, any> {}

interface HTMLAttributesWeak extends React.HTMLAttributes<HTMLElement> {
    onClick?: any;
}

export interface ResetProps extends HTMLAttributesWeak {
    /**
     * 按钮的类型
     */
    type?: 'primary' | 'secondary' | 'normal';

    /**
     * 按钮的尺寸
     */
    size?: 'small' | 'medium' | 'large';

    /**
     * 按钮中 Icon 的尺寸，用于替代 Icon 的默认大小
     */
    iconSize?:
        | 'xxs'
        | 'xs'
        | 'small'
        | 'medium'
        | 'large'
        | 'xl'
        | 'xxl'
        | 'xxxl';

    /**
     * 当 component = 'button' 时，设置 button 标签的 type 值
     */
    htmlType?: 'submit' | 'reset' | 'button';

    /**
     * 设置标签类型
     */
    component?: 'button' | 'a';

    /**
     * 设置按钮的载入状态
     */
    loading?: boolean;

    /**
     * 是否为幽灵按钮
     */
    ghost?: true | false | 'light' | 'dark';

    /**
     * 是否为文本按钮
     */
    text?: boolean;

    /**
     * 是否为警告按钮
     */
    warning?: boolean;

    /**
     * 是否禁用
     */
    disabled?: boolean;

    /**
     * 点击提交后触发
     */
    onClick?: () => void;

    /**
     * 自定义重置的字段
     */
    names?: Array<any>;

    /**
     * 返回默认值
     */
    toDefault?: boolean;

    /**
     * 自定义 field (在 Form 内不需要设置)
     */
    field?: {};
}

export class Reset extends React.Component<ResetProps, any> {}

export interface ErrorProps extends React.HTMLAttributes<HTMLElement> {
    /**
     * 表单名
     */
    name?: string | Array<any>;

    /**
     * 自定义 field (在 Form 内不需要设置)
     */
    field?: {};

    /**
     * 自定义错误渲染, 可以是 node 或者 function(errors, state)
     */
    children?: React.ReactNode | (() => void);
}

export class Error extends React.Component<ErrorProps, any> {}
interface HTMLAttributesWeak extends React.HTMLAttributes<HTMLElement> {
    onChange?: any;
}

export interface FormProps extends HTMLAttributesWeak {
    /**
     * 样式前缀
     */
    prefix?: string;

    /**
     * 内联表单
     */
    inline?: boolean;

    /**
     * 单个 Item 的 size 自定义，优先级高于 Form 的 size, 并且当组件与 Item 一起使用时，组件自身设置 size 属性无效。
     */
    size?: 'large' | 'medium' | 'small';

    /**
     * 标签的位置
     */
    labelAlign?: 'top' | 'left' | 'inset';

    /**
     * 标签的左右对齐方式
     */
    labelTextAlign?: 'left' | 'right';

    /**
     * 经 `new Field(this)` 初始化后，直接传给 Form 即可 用到表单校验则不可忽略此项
     */
    field?: any;

    /**
     * 保存 Form 自动生成的 field 对象
     */
    saveField?: () => void;

    /**
     * 控制第一级 Item 的 labelCol
     */
    labelCol?: {};

    /**
     * 控制第一级 Item 的 wrapperCol
     */
    wrapperCol?: {};

    /**
     * form内有 `htmlType="submit"` 的元素的时候会触发
     */
    onSubmit?: (e: React.FormEvent) => void;

    /**
     * 子元素
     */
    children?: any;

    /**
     * 扩展class
     */
    className?: string;

    /**
     * 自定义内联样式
     */
    style?: React.CSSProperties;

    /**
     * 表单数值
     */
    value?: {};

    /**
     * 表单变化回调
     */
    onChange?: (values: {}, item: {}) => void;

    /**
     * 设置标签类型
     */
    component?: string | (() => void);
}

export default class Form extends React.Component<FormProps, any> {
    static Item: typeof Item;
    static Submit: typeof Submit;
    static Reset: typeof Reset;
    static Error: typeof Error;
}
