package com.bohuikeji.frame.module.admin.entity.web;

import com.alibaba.fastjson.JSONObject;
import com.bohuikeji.frame.module.admin.base.EntityBase;
import com.bohuikeji.frame.module.admin.base.TableBase;
import com.bohuikeji.frame.module.admin.component.StaticComponent;
import lombok.Data;

/**
 * 用于支撑Bootstrap-Table初始化相关设置项
 */
@Data
public class TableInit <T extends EntityBase<T>> extends TableBase {
    /**
     * 用于激活引导表
     * 默认：table
     */
    private String dataToggle;
    /**
     * 表的高度，启用表的固定标题
     * 默认：undefined
     */
    private Integer dataHeight;
    /**
     * 用于设置表格样式，默认情况下，表格是有界的
     * 可使用值：'table'，'table-bordered'，'table-hover'，'table-striped'，'table-dark'，'table-sm'和'table-borderless'
     * 默认值：table table-bordered table-hover
     */
    private String dataClass;
    /**
     * 用于设置表头(标题列)的样式
     * 表thead的类名。Bootstrap v4，使用修饰符类.thead-light或.thead-dark使theads显示为浅灰色或深灰色。
     * 默认：''
     */
    private String dataTheadClasses;
    /**
     * 行样式格式化程序函数，有两个参数：
     *
     * row：行记录数据。
     * index：行索引。
     * 支持类或css。
     * 类型：function
     * 默认：{ }
     */
    private String dataRowStyle;
    /**
     * row属性formatter函数，有两个参数：
     *
     * row：行记录数据。
     * index：行索引。
     * 支持所有自定义属性。
     * 类型：function
     * 默认：{ }
     */
    private String dataRowAttributes;

    /**
     * 定义默认undefined文本，在后端返回数据集包含空值、null等未定义值显示此文本。
     * 默认：'-'
     */
    private String dataUndefinedText;
    /**
     * 设置要使用的语言环境（即'zh-CN'）。必须预先加载区域设置文件。允许后备区域设置（如果已加载），顺序如下：
     * 首先尝试指定的语言环境，
     * 然后尝试将“_”翻译为“ - ”并将区域代码设置为大写的语言环境，
     * 然后尝试短的语言环境代码（即'zh'代替'fr-CA'），
     * 最后将使用加载的最后一个语言环境文件（如果没有加载语言环境，则使用默认语言环境）。
     * 如果为left undefined或空字符串，则使用加载的最后一个语言环境（或者'en-US'如果没有加载语言环境文件）。
     * 默认：undefined
     */
    private String dataLocale;

    /**
     * 设置表头浮动滚动
     */
    private Boolean dataVirtualScroll;

    /**
     * 滚动区域高度
     */
    private Integer dataVirtualScrollItemHeight;

    /**
     * 是否支持表排序
     * 默认 ：true
     */
    private Boolean dataSortable;

    /**
     * 设置排序列的样式？？
     * (官方给的例子没看懂)
     * 默认：undefined
     */
    private String dataSortClass;
    /**
     * 设置false为使用加载消息对数据进行排序。当sidePagination选项设置为时，此选项有效'server'。
     * (应该设置是否由后台排序)
     * 默认：true
     */
    private Boolean dataSilentSort;
    /**
     * 定义要排序的列
     * 默认：undefined
     */
    private String dataSortName;
    /**
     * 定义列排序方式，只能是'asc'或'desc'。
     * 默认：'asc'
     */
    private String dataSortOrder;
    /**
     * 设置true为获得稳定的排序。我们将向'_position'该行添加属性。
     * (排序是否保持，设置为true则每次请求发送排序参数到后台)
     * 默认：false
     */
    private Boolean dataSortStable;
    /**
     * 设置true为记住每列的顺序。
     * 默认：false
     */
    private Boolean dataRememberOrder;
    /**
     * 执行自定义排序功能而不是内置排序功能，需要三个参数：
     * sortName：排序名称。
     * sortOrder：排序顺序。
     * data：行数据。
     * 类型：function
     * 默认：undefined
     */
    private String dataCustomSort;
    /**
     * 用于从远程站点请求数据的URL。
     * 请注意，所需的服务器响应格式会有所不同，具体取决于是否'sidePagination'指定了该选项。
     * 默认：undefined
     */
    private String dataUrl;
    /**
     * 远程服务器请求方式
     * 默认：get
     */
    private String dataMethod;
    /**
     * 是否启用AJAX请求缓存
     * 默认：true
     */
    private Boolean dataCache;
    /**
     * 请求远程数据的contentType，例如：application/x-www-form-urlencoded。
     * 默认：'application/json'
     */
    private String dataContentType;
    /**
     * 希望从服务器返回的数据类型。
     * 默认：json
     */
    private String dataDataType;

    /**
     * 替换Jquery的Ajax实现方法，可自己定义ajax实现方法
     * 类型：function
     * 默认：undefined
     */
    private String dataAjax;

    /**
     * 提交ajax请求的其他选项。
     * (就是支持设置定义请求头，如token。和自定义的其他请求参数)
     * 类型：Object
     * 默认： { }
     */
    private JSONObject dataAjaxOptions;
    /**
     * 请求远程数据时，您可以通过修改queryParams来发送其他参数。
     * 如果queryParamsType = 'limit'，params对象包含：limit，offset，search，sort，order。
     * 否则，它包含：pageSize，pageNumber，searchText，sortName，sortOrder。
     * 返回false停止请求。
     * 类型：function
     * 默认：function(params) { return params }
     */
    private String dataQueryParams="queryParams";

    /**
     * 请求参数类型，不同类型参数名称和参数项不同
     * 设置'limit'为使用RESTFul类型发送查询参数。
     * 默认：limit
     */
    private String  dataQueryParamsType;
    /**
     * 在加载远程数据之前，处理响应数据格式，参数对象包含：
     * res：响应数据。
     * (相当于Response拦截器，在数据渲染之前处理)
     * 类型：function
     * 默认：function(res) { return res }
     */
    private String dataResponseHandler;
    /**
     * 用于指定接收后台返回行总数字段名称，该字段用于组件计算分页
     * 默认：'total'
     */
    private String dataTotalField;
    /**
     * 用于指定接收后台返回行数据字段名称
     * 默认：'rows'
     */
    private  String dataDataField;
    /**
     * 是否在表格底部显示分页工具栏
     * 默认：false
     */
    private Boolean dataPagination;
    /**
     * 分页信息显示，设置true为仅显示表中显示的数据量。它需要将分页表选项设置为true。
     * 默认：false
     */
    private Boolean dataOnlyInfoPagination;
    /**
     * 设置是否为连续分页，即到尾页后返回第一页
     * 默认：true;
     */
    private Boolean dataPaginationLoop;
    /**
     * 分页实现方式，只能是'client'或'server'。使用'server'side需要设置'url'或'ajax'选项。
     * (请勿设置为client，客户端模式为伪分页实现，不适用于大量数据或者数据增长较快的项目)
     * 默认： 'client'
     */
    private String dataSidePagination;

    /**
     * 该属性主要由分页服务器传递，易于使用。
     * 默认：0
     */
    private Integer dataTotalRows;

    /**
     * 设置分页属性时，初始化页码。
     * 默认：1
     */
    private Integer dataPageNumber;

    /**
     * 设置分页属性时，初始化页面大小。
     * 默认：10
     */
    private Integer dataPageSize;

    /**
     * 设置分页属性时，初始化页面大小选择列表。如果您包含'All'或'Unlimited'选项，则所有记录都将显示在您的表格中。
     * 默认： [10, 25, 50, 100]
     */
    private String dataPageList;
    /**
     * 分页水平对齐方式,'left'，'right'可以使用。
     * 默认：'right'
     */
    private String dataPaginationHAlign;

    /**
     * 分页垂直对齐方式。'top'，'bottom'，'both'（穿上顶部和底部的分页）都可以使用。
     * 默认： 'bottom'
     */
    private String dataPaginationVAlign;
    /**
     * 分页细节对齐方式，'left'，'right'可以使用。
     * 默认：'left'
     */
    private String dataPaginationDetailHAlign;

    /**
     * 分页按钮上一页的图标或文字
     * 默认：'‹'
     */
    private String dataPaginationPreText;
    /**
     * 分页按钮下一页的图标或文字
     * 默认：'›'
     */
    private String dataPaginationNectText;

    /**
     * 分页显示的连续最大页数
     * 默认：5
     */
    private Integer dataPaginationSuccessivelySize;

    /**
     * 分页左右俩侧页数
     * 默认：1
     */
    private Integer dataPaginationPagesBySide;

    /**
     * 计算并显示中间页面以便快速访问
     * 默认：false
     */
    private Boolean dataPaginationUseIntermediate;
    /**
     * 是否启用表格搜索
     * 默认：false
     */
    private Boolean dataSearch;

    /**
     * 设置为回车触发搜索
     * 默认：false
     */
    private Boolean  dataSearchOnEnterKey;

    /**
     * 是否启用严格搜索
     * 默认：false
     */
    private Boolean dataStrictSearch;

    /**
     * 是否删除搜索字段中的空格符
     * 默认：true
     */
    private Boolean dataTrimOnSearch;

    /**
     * 搜索文本对齐方式，'left'，'right'可以使用。
     * 默认： 'right'
     */
    private String dataSearchAlign;

    /**
     * 设置搜索触发超时。
     * 默认： 500
     */
    private Integer  dataSearchTimeOut;

    /**
     * 设置搜索属性时，初始化搜索文本。
     * 默认： ''
     */
    private String  dataSearchText;

    /**
     * 执行自定义搜索功能而不是内置搜索功能，需要两个参数：
     * data：表数据。
     * text：搜索文本。
     * 类型：function
     */
    private String dataCustomSearch;

    /**
     * 是否显示表头
     * 默认 true
     */
    private Boolean dataShowHeader;

    /**
     * 是否显示页脚行
     * 默认 false
     */
    private Boolean  dataShowFooter;

    /**
     * 页脚样式格式化程序函数，取一个参数：
     * column：列对象。
     * 类型：function
     *
     */
    private String dataFooterStyle;

    /**
     * 设置表格列是否否启用下拉列
     * 默认：false
     */
    private Boolean dataShowColumns;

    /**
     * 下拉列可隐藏的最小列
     * 默认：1
     * */
    private Integer dataMinimumCountColumns;

    /**
     * 是否显示分页切换按钮
     * 默认：false
     */
    private Boolean dataShowPaginationSwitch;

    /**
     * 是否显示刷新按钮
     * 默认：false
     */
    private Boolean dataShowRefresh;

    /**
     * 是否显示表格试图切换按钮
     * 默认：false
     */
    private Boolean  dataShowToggle;

    /**
     * 是否显示全屏按钮
     * 默认：false
     */
    private Boolean  dataShowFullscreen;

    /**
     * 是否智能显示分页或者卡片视图
     * 默认：true
     */
    private Boolean dataSmartDisplay;

    /**
     * 是否自动插入htnl转义字符以支持html代码显示
     * 默认：false
     */
    private  Boolean dataEscape;

    /**
     * 指定表ID字段
     * 默认：undefined
     */
    private String dataIdField;
    /**
     * 单选框和复选框的名称
     * 默认:btSelectItem
     */
    private String dataSelectItemName;

    /**
     *单击行是否选中单选框/复选框
     * 默认：false
     */
    private Boolean dataClickToSelect;

    /**
     * 单机选中忽略事件，单机单选框/复选框/优先调用此事件，如需忽略此次点击返回true,否则返回false\
     * 参数：element（被单击的对象元素）
     * 默认： { return ['A', 'BUTTON'].includes(tagName) }
     */
    private String dataIgnoreClickToSelectOn;

    /**
     * 设置true为允许复选框仅选择一行。
     * 默认:false
     */
    private Boolean dataSingleSelect;

    /**
     * 设置false为隐藏标题行中的check-all复选框。
     * 默认:ture
     */
    private  Boolean dataCheckboxHeader;

    /**
     * 设置true为在更改页面上维护选定的行并进行搜索。
     * 默认:true
     */
    private Boolean dataMaintainSelected;

    /**
     * 指示每行的唯一标识符。
     * 默认：undefined
     */
    private String dataUniqueId;

    /**
     * 设置true为显示卡片视图表，例如移动视图。
     * 默认： false
     */
    private Boolean  dataCardView;

    /**
     * 设置true为显示详细视图表。
     *
     * 默认： false
     */
    private  Boolean dataDetailView;

    /**
     * 当detailView设置为true时格式化您的详细信息视图。返回一个String，它将被附加到详细视图单元格中，可选地使用第三个参数直接渲染元素，该参数是目标单元格的jQuery元素。
     * 默认： function(index, row, element) { return '' }
     */
    private String dataDetailFormatter;
    /**
     * 当detailView设置为true时，每行启用扩展。返回true并且将启用该行以进行扩展，返回false并禁用该行的扩展。默认函数返回true以启用所有行的扩展。
     * 类型：function
     * 默认： function(index, row) { return true }
     */
    private  String dataDetailFilter;

    /**
     * 指示如何对齐自定义工具栏。'left'，'right'可以使用。
     * 默认： 'left'
     */
    private String dataToolbarAlign;

    /**
     * jQuery选择，指示自定义按钮工具栏，例如：#buttons-toolbar，.buttons-toolbar，或DOM节点。
     * 默认： undefined
     */
    private String dataButtonsToolbar;
    /**
     * 指示如何对齐工具栏按钮。'left'，'right'可以使用。
     * 默认： 'right'
     */
    private String dataButtonsAlign;

    /**
     * 定义'btn-'表按钮的类（后添加）。
     * 默认： 'secondary'
     */
    private String dataButtonsClass;
    /**
     * 定义工具栏，分页和详细信息视图中使用的图标。
     * 默认：
     *   {
     *     paginationSwitchDown: 'fa-caret-square-down',
     *     paginationSwitchUp: 'fa-caret-square-up',
     *     refresh: 'fa-sync',
     *     toggleOff: 'fa-toggle-off',
     *     toggleOn: 'fa-toggle-on',
     *     columns: 'fa-th-list',
     *     fullscreen: 'fa-arrows-alt',
     *     detailOpen: 'fa-plus',
     *     detailClose: 'fa-minus'
     *   }
     */
    private String dataIcons;

    /**
     * 定义图标的大小，undefined，'lg'，'sm'都可以使用。
     * 默认： undefined
     */
    private String dataIconSize;

    /**
     * 定义图标集名称（'glyphicon'或'fa'FontAwesome）。默认情况下'fa'用于Bootstrap v4。
     * 默认： 'fa'
     */
    private String dataIconsPrefix;

    /**
     * 构造方法组
     */
    /*public TableInit(){

    }*/
    public TableInit(String dataUrl){
        this.dataUrl=dataUrl;
        this.dataSidePagination="server";
    }

    /**
     * 静态初始化方法组
     * @param dataUrl
     * @return
     */
    public static TableInit getEmptyStyle(String dataUrl){
        return new TableInit(dataUrl);
    }

    /**
     * 默认表格初始化风格
     * @return
     */
    public static TableInit getDefaultStyle(){
        TableInit tableInit=new TableInit(StaticComponent.ctx +"/table/query");
        tableInit.setDataPagination(true);
        tableInit.setDataSearch(true);
        tableInit.setDataShowRefresh(true);
        tableInit.setDataSortable(true);
        tableInit.setDataSearchTimeOut(800);
        //tableInit.setDataHeight(600);
        tableInit.setDataClickToSelect(true);
        //.setDataSearchOnEnterKey(true);
        tableInit.setDataVirtualScroll(true);
        tableInit.setDataShowColumns(true);
        tableInit.setDataStrictSearch(true);
        tableInit.setDataMethod("get");
        return tableInit;
    }

    /**
     * 抖音数据处理暂时
     * @return
     */
    public static TableInit getDouyinStyle(){
        TableInit tableInit=new TableInit(StaticComponent.ctx +"/settle/record/query");
        tableInit.setDataPagination(true);
        tableInit.setDataSearch(true);
        tableInit.setDataShowRefresh(true);
        tableInit.setDataSortable(true);
        tableInit.setDataSearchTimeOut(800);
        //tableInit.setDataHeight(600);
        tableInit.setDataClickToSelect(true);
        //.setDataSearchOnEnterKey(true);
        tableInit.setDataVirtualScroll(true);
        tableInit.setDataShowColumns(true);
        tableInit.setDataStrictSearch(true);
        tableInit.setDataMethod("get");
        return tableInit;
    }
}
