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

import * as React from 'react';

export interface TooltipProps extends React.HTMLAttributes<HTMLElement> {
    /**
     * 样式类名的品牌前缀
     */
    prefix?: string;

    /**
     * 自定义类名
     */
    className?: string;

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

    /**
     * tooltip的内容
     */
    children?: any;

    /**
     * 弹出层位置
     */
    align?:
        | 't'
        | 'r'
        | 'b'
        | 'l'
        | 'tl'
        | 'tr'
        | 'bl'
        | 'br'
        | 'lt'
        | 'lb'
        | 'rt'
        | 'rb';

    /**
     * 触发元素
     */
    trigger?: any;

    /**
     * 触发行为
     * 鼠标悬浮,  鼠标点击('hover', 'click')或者它们组成的数组，如 ['hover', 'click'], 强烈不建议使用'focus'，若有复杂交互，推荐使用triggerType为click的Balloon组件
     */
    triggerType?: string | Array<any>;

    /**
     * 弹层组件style，透传给Popup
     */
    popupStyle?: {};

    /**
     * 弹层组件className，透传给Popup
     */
    popupClassName?: string;

    /**
     * 弹层组件属性，透传给Popup
     */
    popupProps?: {};

    /**
     * 是否pure render
     */
    pure?: boolean;

    /**
     * 指定浮层渲染的父节点, 可以为节点id的字符串，也可以返回节点的函数。
     */
    popupContainer?: string | HTMLElement | ((target: HTMLElement) => HTMLElement);

    /**
     * 弹层id, 传入值才会支持无障碍
     */
    id?: string;
    /**
     * 是否跟随滚动
     */
    followTrigger?: boolean;
}

interface localeProps {
  confirm?: string;
  cancel?: string;
}
export interface PopConfirmProps extends Omit<React.HTMLAttributes<HTMLElement>, 'title'> {
    prefix?: string;
    locale?: localeProps;
    size?: 'small' | 'medium' | 'large';
    type?: 'info' | 'warning' | 'success' | 'danger';
    align?: 't'
    | 'r'
    | 'b'
    | 'l'
    | 'tl'
    | 'tr'
    | 'bl'
    | 'br'
    | 'lt'
    | 'lb'
    | 'rt'
    | 'rb';
    alignEdge?: boolean;
    icon?: React.ReactNode;
    title?: React.ReactNode;
    content?: React.ReactNode;
    footer?: boolean;
    confirmProps?: object;
    cancelProps?: object;
    onConfirm?: (e: MouseEvent) => void;
    onCancel?: (e: MouseEvent) => void;
    defaultVisible?: boolean;
    visible?: boolean;
    onVisibleChange?: (visible: boolean) => void;
    offset?: Array<number>;
    trigger: React.ReactNode;
    triggerType?: 'hover' | 'click';
    needAdjust?: boolean;
    shouldUpdatePosition?: boolean;
    safeNode?: string;
    safeId?: string;
    animation?: object | boolean;
    cache?: boolean;
    popupContainer?: any;
    popupStyle?: React.CSSProperties;
    popupClassName?: string;
    popupProps?: object;
    followTrigger?: boolean;
    id?: string;
}

export class Tooltip extends React.Component<TooltipProps, any> {}
export class PopConfirm extends React.Component<PopConfirmProps, any> {}
export interface BalloonProps extends React.HTMLAttributes<HTMLElement> {
    /**
     * 自定义类名
     */
    className?: string;

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

    /**
     * 浮层的内容
     */
    children?: any;

    /**
     * 样式类型
     */
    type?: 'normal' | 'primary';

    /**
     * 弹层当前显示的状态
     */
    visible?: boolean;

    /**
     * 弹层默认显示的状态
     */
    defaultVisible?: boolean;

    /**
     * 弹层在显示和隐藏触发的事件
     */
    onVisibleChange?: (visible: boolean) => void;

    /**
     * 弹出层对齐方式
     */
    alignEdge?: boolean;

    /**
     * 是否显示关闭按钮
     */
    closable?: boolean;

    /**
     * 弹出层位置
     */
    align?:
        | 't'
        | 'r'
        | 'b'
        | 'l'
        | 'tl'
        | 'tr'
        | 'bl'
        | 'br'
        | 'lt'
        | 'lb'
        | 'rt'
        | 'rb';

    /**
     * 弹层相对于trigger的定位的微调
     */
    offset?: Array<any>;

    /**
     * 触发元素
     */
    trigger?: any;

    /**
     * 触发行为
     * 鼠标悬浮, 鼠标点击('hover','click')或者它们组成的数组，如 ['hover', 'click'], 强烈不建议使用'focus'，若弹窗内容有复杂交互请使用click
     */
    triggerType?: string | Array<any>;

    /**
     * 任何visible为false时会触发的事件
     */
    onClose?: () => void;

    /**
     * 是否进行自动位置调整
     */
    needAdjust?: boolean;

    /**
     * 弹层在触发以后的延时显示, 单位毫秒 ms
     */
    delay?: number;

    /**
     * 浮层关闭后触发的事件, 如果有动画，则在动画结束后触发
     */
    afterClose?: () => void;

    /**
     * 强制更新定位信息
     */
    shouldUpdatePosition?: boolean;

    /**
     * 弹层出现后是否自动focus到内部第一个元素
     */
    autoFocus?: boolean;

    /**
     * 安全节点:对于triggetType为click的浮层,会在点击除了浮层外的其它区域时关闭浮层.safeNode用于添加不触发关闭的节点, 值可以是dom节点的id或者是节点的dom对象
     */
    safeNode?: string;

    /**
     * 用来指定safeNode节点的id，和safeNode配合使用
     */
    safeId?: string;

    /**
     * 配置动画的播放方式
     */
    animation?: {} | boolean;

    /**
     * 弹层的dom节点关闭时是否删除
     */
    cache?: boolean;

    /**
     * 指定浮层渲染的父节点, 可以为节点id的字符串，也可以返回节点的函数。
     */
    popupContainer?: string | HTMLElement | ((target: HTMLElement) => HTMLElement);

    /**
     * 弹层组件style，透传给Popup
     */
    popupStyle?: {};

    /**
     * 弹层组件className，透传给Popup
     */
    popupClassName?: string;

    /**
     * 弹层组件属性，透传给Popup
     */
    popupProps?: {};

    /**
     * 弹层id, 传入值才会支持无障碍
     */
    id?: string;
}

export default class Balloon extends React.Component<BalloonProps, any> {
    static Tooltip: typeof Tooltip;
    static PopConfirm: typeof PopConfirm;
}
