/**
 * 通用数据表格组件
 *
 * @author GuoXin
 * @since 2021-05-19
 */
layui.define(['table'], function (exports) {
    let table = layui.table;
    const componentOptions = new Map();
    let temp_options;

    let options = {
        title: '数据表格',
        url:'',
        method: 'POST',
        toolbar: '#tableToolBar',
        //请求前参数处理
        request: {
            pageName: 'current' //页码的参数名称，默认：page
            , limitName: 'size' //每页数据量的参数名，默认：limit
        },
        response: {
            statusName: 'flag' //规定数据状态的字段名称，默认：code
            , statusCode: true //规定成功的状态码，默认：0
            , msgName: 'msg' //规定状态信息的字段名称，默认：msg
            , countName: 'total' //规定数据总数的字段名称，默认：count
            , dataName: 'records' //规定数据列表的字段名称，默认：data
        },
        //响应后数据处理
        parseData: function (res) { //res 即为原始返回的数据
            //console.info(res)
            let data = res.data || {};
            return {
                "flag": res.flag, //解析接口状态
                "msg": res.msg, //解析提示文本
                "records": data.records || res.records || data, //解析数据长度
                "total": data.total || data.length //解析数据列表
            };
        },
        defaultToolbar: ['', '', ''],
        page: true,
        height: 'full-74',
        cellMinWidth: 80,
        cols: [[{}]],
        where: {},
        done: function (res) {},//加载完成
        onToolBarTable: function (obj) {}, // 表格工具事件
        onToolBarRow: function (obj) {}, //行工具事件
        onRow: function(obj){}, // 行点击事件
        onRowDouble: function(obj){}, // 行双击事件
        onRadio: function(obj){}, //单选框选中事件
        onChecked: function(obj){}, //复选框选中事件
        onEdit: function(obj){} // 行内编辑事件
    };

    class Gtable{
        constructor(ops) {
            this.options = ops;
            this.render();
        }

        /**
         * 渲染组件
         */
        render(){
            let ops = this.options;
            ops.elem = `#${ops.id}`;
            let tableObj = table.render(ops);
            table.on(`toolbar(${ops.id})`, function(obj){
                ops.onToolBarTable && ops.onToolBarTable(obj);
            });
            table.on(`tool(${ops.id})`, function(obj){
                ops.onToolBarRow && ops.onToolBarRow(obj);
            });
            table.on(`row(${ops.id})`, function(obj) {
                ops.onRow && ops.onRow(obj);
            });
            table.on(`radio(${ops.id})`, function(obj) {
                ops.onRadio && ops.onRadio(obj);
            });
            table.on(`checkbox(${ops.id})`, function(obj) {
                ops.onChecked && ops.onChecked(obj);
            });
            table.on(`edit(${ops.id})`, function(obj) {
                ops.onEdit && ops.onEdit(obj);
            });
            table.on(`rowDouble(${ops.id})`, function(obj) {
                ops.onRowDouble && ops.onRowDouble(obj);
            });
            $.extend(this, tableObj);
        }

        /**
         * 重新加载组件
         * @param ops
         */
        reload(ops){
            let _opt = $.extend(this.options, ops);
            table.reload(this.options.id, _opt);
            componentOptions.set(this.options.id, _opt);
        }

        /**
         * 获取选中数据行
         * @returns {*}
         */
        getCheckStatus(){
            return table.checkStatus(this.options.id);
        }

        /**
         * 获取组件数据
         * @returns {*}
         */
        getData(){
            return table.getData(this.options.id);
        }

        on(event, callback){
            table.on(`${event}(${this.options.id})`, callback);
        }
    }

    const gtable = $.extend({}, table);
    /**
     * 表格初始化
     * @param opt
     * @returns {*} 返回原始table组件对象
     */
    gtable.init = function (opt) {
        let _option = Object.assign({}, options, opt);
        componentOptions.set(_option.id, _option);
        if (_option.id.startsWith('#')) {
            _option.id = _option.id.substring(1)
        }
        temp_options = _option;
        return new Gtable(_option);
    };
    /**
     * 表格重载
     * @param opt
     */
    gtable.reload = function (opt) {
        table.reload(temp_options.id, opt);
    };

    /**
     * 获取选中数据
     * @returns {*}
     */
    gtable.getCheckStatus = function(){
        return table.checkStatus(temp_options.id);
    }

    /**
     * 获取当前表格当前页数据
     * @returns {*}
     */
    gtable.getData = function(){
        return table.getData(temp_options.id);
    }

    exports('gtable', gtable);
})