import { HttpHeaders, HttpParams } from '@angular/common/http';
import { TemplateRef, TrackByFunction } from '@angular/core';
import { Observable } from 'rxjs';
import type { NzSafeAny } from 'ng-zorro-antd/core/types';
import type { NzDrawerOptions } from 'ng-zorro-antd/drawer';
import type { ModalOptions } from 'ng-zorro-antd/modal';
import type { PaginationItemRenderContext } from 'ng-zorro-antd/pagination';
import type { NzTableSortOrder } from 'ng-zorro-antd/table';
export interface YunzaiSTConfig {
    /**
     * 起始页码，默认为：`1`
     */
    pi?: number;
    /**
     * 每页数量，默认：`10`
     */
    ps?: number;
    /**
     * 是否显示边框，默认：`false`
     */
    bordered?: boolean;
    /**
     * table大小，默认：`default`
     */
    size?: 'small' | 'middle' | 'default';
    /**
     * 是否开启响应式，默认：`true`
     */
    responsive?: boolean;
    /**
     * 是否在小屏幕下才显示顶部与底部，默认：`false`
     */
    responsiveHideHeaderFooter?: boolean;
    /** 请求体配置 */
    req?: {
        /**
         * 分页类型，默认：`page`
         * - `page` 使用 `pi`，`ps` 组合
         * - `skip` 使用 `skip`，`limit` 组合
         */
        type?: 'page' | 'skip';
        /**
         * Whether to ignore `null` or `unfind` values in parameters
         *
         * 是否忽略参数中 `null` 或 `undefind` 值
         */
        ignoreParamNull?: boolean;
        /** 请求方法，默认：`GET` */
        method?: string;
        /** 请求体 `Header` */
        headers?: NzSafeAny;
        /**
         * 重命名参数 `pi`、`ps`，默认：`{ pi: 'pi', ps: 'ps', skip: 'skip', limit: 'limit' }`
         * - `{ pi: 'Page' }` => `pi` 会被替换成 Page
         */
        reName?: {
            pi?: string;
            ps?: string;
            skip?: string;
            limit?: string;
        };
        /**
         * 是否将请求所有参数数据都放入 `body` 当中（`url` 地址本身参数除外），仅当 `method: 'POST'` 时有效，默认：`false`
         */
        allInBody?: boolean;
        /**
         * 是否延迟加载数据，即渲染结束后不会主动发起请求，默认：`false`
         */
        lazyLoad?: boolean;
        /**
         * 请求前数据处理
         */
        process?: (requestOptions: NzSafeAny) => NzSafeAny;
    };
    /** 返回体配置 */
    res?: {
        /**
         * 重命名返回参数 `total`、`list`，默认：`{ list: ['list'], total: ['total'] }`
         * - `{ total: 'Total' }` => Total 会被当作 `total`
         */
        reName?: {
            total?: string | string[];
            list?: string | string[];
        } | ((result: NzSafeAny, options: {
            pi: number;
            ps: number;
            total: number;
        }) => {
            total: number;
            list: NzSafeAny[];
        });
        /**
         * 数据预处理
         */
        process?: (data: NzSafeAny[], rawData?: NzSafeAny) => NzSafeAny[];
    };
    /** 返回体配置 */
    page?: {
        /**
         * 前端分页，当 `data` 为`any[]` 或 `Observable<any[]>` 有效，默认：`true`
         * - `true` 由 `st` 根据 `data` 长度受控分页，包括：排序、过滤等
         * - `false` 由用户通过 `total` 和 `data` 参数受控分页，并维护 `(change)` 当分页变更时重新加载数据
         */
        front?: boolean;
        /**
         * 后端分页是否采用`0`基索引，只在`data`类型为`string`时有效，默认：`false`
         */
        zeroIndexed?: boolean;
        /**
         * 指定分页显示的位置，默认：`bottom`
         */
        position?: 'top' | 'bottom' | 'both';
        /**
         * 指定分页分页方向，默认：`right`
         */
        placement?: 'left' | 'center' | 'right';
        /**
         * 是否显示分页器，默认：`true`
         */
        show?: boolean;
        /**
         * 是否显示分页器中改变页数，默认：`false`
         */
        showSize?: boolean;
        /**
         * 分页器中每页显示条目数下拉框值，默认：`[10, 20, 30, 40, 50]`
         */
        pageSizes?: number[];
        /**
         * 是否显示分页器中快速跳转，默认：`false`
         */
        showQuickJumper?: boolean;
        /**
         * 是否显示总数据量，默认：`true`
         * - `boolean` 类型显示与否，默认模板：`共 {{total}} 条`
         * - `string` 自定义模板，模板变量：
         *  - `{{total}}` 表示数据总量
         *  - `{{range[0]}}` 表示当前页开始数量值
         *  - `{{range[1]}}` 表示当前页结束数量值
         */
        total?: string | boolean;
        /**
         * 用于自定义页码的结构，用法参照 Pagination 组件
         */
        itemRender?: TemplateRef<PaginationItemRenderContext> | null;
        /**
         * 当添加该属性时，显示为简单分页，默认：`false`
         */
        simple?: boolean;
        /**
         * 切换分页时返回顶部，默认：`true`
         */
        toTop?: boolean;
        /**
         * 返回顶部偏移值，默认：`100`
         */
        toTopOffset?: number;
    };
    /**
     * 重命名排序值，`columns` 的重命名高于属性
     */
    sortReName?: {
        ascend?: string;
        descend?: string;
    };
    /**
     * 排序状态
     */
    sortDirections?: NzTableSortOrder[];
    /**
     * 单排序规则
     * - 若不指定，则返回：`columnName=ascend|descend`
     * - 若指定，则返回：`sort=columnName.(ascend|descend)`
     */
    singleSort?: {
        /** 请求参数名，默认：`sort` */
        key?: string;
        /** 列名与状态间分隔符，默认：`.` */
        nameSeparator?: string;
    };
    /**
     * 是否多排序，当 `sort` 多个相同值时自动合并，建议后端支持时使用
     */
    multiSort?: {
        /** 请求参数名，默认：`sort` */
        key?: string;
        /** 不同属性间分隔符，默认：`-` */
        separator?: string;
        /** 列名与状态间分隔符，默认：`.` */
        nameSeparator?: string;
        /**
         * 是否以数组的形式传递参数
         * - `true` 表示使用 `url?sort=name.asc&sort=age.desc` 形式
         * - `false` 表示使用 `url?sort=name.asc-age.desc` 形式
         */
        arrayParam?: boolean;
        /**
         * 是否全局多排序模式，默认：`true`
         * - `true` 表示所有 `st` 默认为多排序
         * - `false` 表示需要为每个 `st` 添加 `multiSort` 才会视为多排序模式
         */
        global?: boolean;
        /**
         * 是否保持空值的键名，默认：`true`
         * - `true` 表示不管是否有排序都会发送 `key` 键名
         * - `false` 表示无排序动作时不会发送 `key` 键名
         */
        keepEmptyKey?: boolean;
    };
    /**
     * 按钮模态框配置
     */
    modal?: {
        /**
         * 是否只传递纯净数据
         */
        pureRecoard?: boolean;
        /**
         * 指定模态框目标组件的接收参数名，默认：`record`
         */
        paramsName?: string;
        /** 大小；例如：lg、600，默认：`lg` */
        size?: 'sm' | 'md' | 'lg' | 'xl' | '' | number;
        /** 对话框 [ModalOptions](https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/components/modal/modal-types.ts) 参数 */
        modalOptions?: ModalOptions;
        /** 是否精准（默认：`true`），若返回值非空值（`null`或`undefined`）视为成功，否则视为错误 */
        exact?: boolean;
    };
    /**
     * 按钮抽屉配置
     */
    drawer?: {
        /**
         * 是否只传递纯净数据
         */
        pureRecoard?: boolean;
        /**
         * 抽屉目标组件的接收参数名，默认：`record`
         */
        paramsName?: string;
        /**
         * 大小；例如：lg、600，默认：`md`
         *
         * | 类型 | 默认大小 |
         * | --- | ------ |
         * | `sm` | `300` |
         * | `md` | `600` |
         * | `lg` | `900` |
         * | `xl` | `1200` |
         *
         * > 以上值，可通过覆盖相应的LESS参数自行调整
         */
        size?: 'sm' | 'md' | 'lg' | 'xl' | number;
        /**
         * 是否包含底部工具条，默认：`true`
         */
        footer?: boolean;
        /**
         * 底部工具条高度，默认：`55`
         */
        footerHeight?: number;
        /** 抽屉 [NzDrawerOptions](https://ng.ant.design/components/drawer/zh#nzdraweroptions) 参数 */
        drawerOptions?: NzDrawerOptions;
    };
    /**
     * 气泡参数
     */
    pop?: {
        /**
         * Title of the popover, default: `确认删除吗？`
         */
        title?: string;
        /**
         * Popover trigger mode, default: `click`
         */
        trigger?: 'click' | 'focus' | 'hover';
        /**
         * The position of the popover relative to the target, default: `top`
         */
        placement?: 'top' | 'left' | 'right' | 'bottom' | 'topLeft' | 'topRight' | 'bottomLeft' | 'bottomRight' | 'leftTop' | 'leftBottom' | 'rightTop' | 'rightBottom';
        /**
         * Class name of the popover card
         */
        overlayClassName?: string;
        /**
         * Style of the popover card
         */
        overlayStyle?: Record<string, string>;
        /**
         * Text of the Cancel button
         */
        cancelText?: string;
        /**
         * Text of the Confirm button
         */
        okText?: string;
        /**
         * Button `type` of the Confirm button
         */
        okType?: 'primary' | 'ghost' | 'dashed' | 'danger' | 'default';
        /**
         * Customize icon of confirmation
         */
        icon?: string;
    };
    /**
     * 过滤按钮确认文本
     */
    filterConfirmText?: string;
    /**
     * 过滤按钮重置文本
     */
    filterClearText?: string;
    /**
     * 按钮图标
     */
    btnIcon?: {
        /** 图标主题风格，默认：`outline` */
        theme?: 'outline' | 'twotone' | 'fill';
        /** 是否有旋转动画，默认：`false` */
        spin?: boolean;
        /** 仅适用双色图标，设置双色图标的主要颜色，仅对当前 icon 生效 */
        twoToneColor?: string;
        /** 指定来自 IconFont 的图标类型 */
        iconfont?: string;
    };
    /**
     * 行号索引，默认：`1`
     * - 计算规则为：`index + noIndex`
     */
    noIndex?: number;
    /**
     * 表格行的类名
     */
    rowClassName?: (record: NzSafeAny, index: number) => string;
    /**
     * 通过点击行来展开子行，Default: `false`
     */
    expandRowByClick?: boolean;
    /**
     * 手风琴模式，Default: `false`
     */
    expandAccordion?: boolean;
    /**
     * 指定 `width` 模式
     */
    widthMode?: {
        /**
         * 宽度类型，默认：`default`
         * - `default` 默认行为
         * - `strict` 严格模式，即强制按 `width` 指定的宽度呈现，并根据 `strictBehavior` 类型处理
         */
        type?: 'strict' | 'default';
        /**
         * 严格模式的处理行为，默认：`truncate`
         * - `wrap` 强制换行
         * - `truncate` 截短
         */
        strictBehavior?: 'wrap' | 'truncate';
    };
    /**
     * Default: `54`
     */
    virtualItemSize?: number;
    /**
     * Default: `200`
     */
    virtualMaxBufferPx?: number;
    /**
     * Default: `100`
     */
    virtualMinBufferPx?: number;
    /**
     * The TrackByFunction to use for tracking changes
     */
    virtualForTrackBy?: TrackByFunction<unknown>;
    /**
     * Conditional expression rendering behavior, can be set to `hide` (default) or `disabled`, Default: `hide`
     */
    iifBehavior?: 'hide' | 'disabled';
    /**
     * The spinning indicator
     */
    loadingIndicator?: TemplateRef<void>;
    /**
     * Specifies a delay in milliseconds for loading state (prevent flush)
     */
    loadingDelay?: number;
    /**
     * Custom no result content
     */
    noResult?: string | TemplateRef<void>;
    /**
     * Safe rendering type, default: `safeHtml`
     *
     * 安全渲染方式，默认：`safeHtml`
     */
    safeType?: 'text' | 'html' | 'safeHtml';
    /**
     * Override the default request behavior, you can customize your own request implementation, for example: Graphql
     *
     * 覆盖默认的请求行为，可以自定义自己的请求实现，例如：Graphql
     */
    customRequest?: (options: {
        method: string;
        url: string;
        options: {
            body?: unknown;
            headers?: HttpHeaders | Record<string, string | string[]>;
            params?: HttpParams | Record<string, string | string[]>;
        };
    }) => Observable<NzSafeAny>;
    /**
     * Date format
     *
     * 日期格式化
     */
    date?: {
        /**
         * Format string, default: `yyyy-MM-dd HH:mm`
         *
         * 格式化字符串，默认：`yyyy-MM-dd HH:mm`
         */
        format: string;
    };
    yn?: {
        /**
         * 真值条件，（默认：`true`）
         */
        truth?: unknown;
        /**
         * 徽章 `true` 时文本，（默认：`是`）
         */
        yes?: string;
        /**
         * 徽章 `false` 时文本，（默认：`否`）
         */
        no?: string;
        /**
         * 徽章显示风格，默认：`icon`
         * - `full` 图标和文本
         * - `icon` 图标
         * - `text` 文本
         */
        mode?: 'full' | 'icon' | 'text';
    };
    /**
     * Max button option can be showed, and the extra part are auto generated under `more`
     *
     * 配置最多显示多少个按钮，多余部分自动生成至 `更多` 下面
     *
     * > 注意：若在 `buttons` 下配置过按钮组会导致其失效
     */
    maxMultipleButton?: {
        /**
         * 更多按钮文本，默认：`更多`
         */
        text?: string;
        /**
         * 超出数量自动合并，默认：`2`
         */
        count?: number;
    };
}
