import is from 'is';
import { tools } from 'hq-tools';
const numberFormat =  (value,format) =>{
    if ( value ){
        return tools.partition(value,format);
    }else{
        return null
    }
    
}
const dateFormat = (value,format = 'yyyy-MM-dd') =>{
    return tools.dateFormat(value,format);
}
//标准列
export default class Column{
    constructor(
        {
            //进阶属性
            dataType='string', //数据类型
            align,//对齐
            dict,//字典，sort用于翻译
            asyncTranslate,//异步翻译
            format,//格式化
            //列组共有属性
            headerName,//表头，如果没有指定则使用field
            columnGroupShow,//当组关闭时是否显示列
            headerClass,//表头的类
            toolPanelClass,//工具面板的类
            suppressToolPanel,//在工具面板中隐藏

            //仅列属性
            field,//获取数据的域
            colId,//列的Id，
            type,//逗号分隔的字符串或包含ColumnType键的字符串数组，可用作列的模板。当您拥有许多常见的列属性时，这有助于减少属性的重复。
            
            width,//宽度（单位px）
            minWidth = 140,//最小宽度（单位px）
            maxWidth,//最大宽度（单位px）

            filter,//过滤组件，true 为默认
            filterFramework,//框架过滤
            floatingFilterComponent,//浮动过滤组件
            floatingFilterComponentFramework,//框架浮动过滤组件
            floatingFilterComponentParams,//定制参数传递给floatingFilterComponent或floatingFilterComponentFramework

            hide,//隐藏
            pinned,//固定位置
            lockPosition,//设置为true使本列永远显示在前列
            lockVisible,//设置为true阻止本列显示或者隐藏，API仍然有效
            lockPinned,//设置为true阻止本列固定位置变化，API仍然有效

            sortable,//是否可以排序
            sort,//默认排序方式，‘asc’，‘desc’
            sortedAt,//如果默认情况下进行多重排序，则此列应说明它开始排序的时间点，网格知道执行排序的顺序。
            sortingOrder,//决定排序发生顺序的数组，值可以为asc, desc 或者 null

            resizable,//是否可以调整尺寸
            headerTooltip,//标题的悬停提示
            tooltipField,//要应用于单元格的工具提示字段。
            tooltip,//目前无法使用。采用的回调（value，valueFormatted，data，node，colDef，rowIndex和api）它必须返回用作工具提示的字符串。tooltipField优先。
            checkboxSelection,//是否显示复选框
            rowDrag,//行是否可以拖动
            cellClass,//单元格的类
            cellStyle,//单元格的样式
            editable,//是否可以编辑
            onCellValueChanged,//单元格值变动回调
            cellRenderer,//单元格渲染，函数，返回dom或者调用的组件名
            cellRendererFramework,//框架单元格渲染
            //floatingCellRenderer,//浮动单元格渲染
            //floatingCellRendererFramework,//框架浮动单元格渲染
            cellRendererSelector,//?单元格选择器
            cellEditorSelector,//?
            cellEditor,//单元格编辑器
            cellEditorFramework,//框架单元格编辑器
            valueGetter,//函数或者表达式。从数据中获取要显示的。
            valueFormatter,//函数或者表达式。格式化显示的值
            headerValueGetter,//函数或者表达式。获取标题中显示的值。
            filterValueGetter,//函数或者表达式。获取用于过滤目的的值。
            //floatingCellFormatter,//函数或者表达式。用于固定行的格式化程序。如果缺少，将使用正常的valueFormatter。
            valueSetter,//函数或者表达式。将值设置为数据以进行保存。如果数据发生更改，则返回true。
            valueParser,//函数或者表达式。解析储蓄的价值。
            keyCreator,//?
            getQuickFilterText,//如果不想用默认的快速文本过滤（toString），可以在这里修改规则
            aggFunc,//聚合
            allowedAggFuncs,//聚合
            rowGroupIndex,//在要分组的列中设置此项。如果仅按一列分组，请将其设置为任意数字（例如0）。如果按多列分组，请将此列设置为您希望此列位于组中的位置（例如，0表示第一个，1表示第二个，依此类推）。

            //pivotIndex,//企业级属性，在要转动的列中设置此项。如果仅旋转一列，请将其设置为任意数字（例如0）。如果按多列旋转，请将此列设置为您希望此列按枢轴顺序排列的位置（例如，0表示第一个，1表示第二个，依此类推）
            comparator,//一般排序的比较器
            //pivotComparatorpivotComparator,//企业级属性
            unSortIcon,//是否显示未排序图标
            //enableRowGroup,//企业级属性
            //enablePivot,//企业级属性

            //pivotTotals,//企业级属性
            //enableValue,//企业级属性
            enableCellChangeFlash,//设置为true以使网格在刷新时刷新单元格。
            menuTabs,//设置为包含零个，一个或多个以下选项的数组'filterMenuTab'，'generalMenuTab'和'columnsMenuTab'。这用于确定哪些菜单选项卡以及选项卡的显示顺序
            suppressMenu,//	如果此列标题不显示任何菜单，则设置为true。

            suppressSizeToFit,//如果要在“sizeToFit”操作期间固定此列宽度，请设置为true
            suppressMovable,//如果您不希望此列通过拖动移动，则设置为true。

            suppressNavigable,//抑制导航
            suppressCellFlash,//抑制单元格刷新
            suppressKeyboardEvent,//抑制键盘事件
            onCellClicked,//单元格单击回调
            onCellDoubleClicked,//单元格双击回调
            onCellContextMenu,//单元格右键回调
            autoHeight,//自动高度
            singleClickEdit,//单击启用编辑
        }
    ){
        let nowCellRender;
        let nowCellEditor;
        //先根据进阶属性生成一些配置，然后如果配置与生成的配置冲突，则覆盖自动生成
        this.sortable = dataType==='buttons'?false:true;
        if (dataType === 'number' && format ){
            this.valueFormatter = (params)=>{
                return numberFormat(params.value,format);
            };
        }else if ( dataType === 'date' ){
            this.valueFormatter = (params)=>{
                return dateFormat(params.value,format);
            };;
        }
        if (dict || asyncTranslate){
            nowCellRender = 'translateCell';
            nowCellEditor = 'dictCellEditor';
        }else if ( dataType === 'boolean' ){
            nowCellRender = 'booleanCell';
        }
        this.filter = (()=>{
            let columnFilter;
            if (columnFilter === 'number' ){
                filter = 'agNumberColumnFilter';
            }else if (dataType === 'date'){
                columnFilter = 'agDateColumnFilter';
            }else if (dataType === 'string' && (dict || asyncTranslate )){
                columnFilter = 'dictFilter';
            }else if (dataType === 'string'){
                columnFilter = 'agTextColumnFilter';
            }
            if ( filter === 'default'){
                return columnFilter;
            }
           
        })()
        this.cellStyle = (()=>{
            if ( !cellStyle ){
                return {
                    'text-align':align
                }
            }
            else if ( is.object(cellStyle) ){
                return Object.assign({},cellStyle,{
                    'text-align':align
                })
            }else if ( is.string(cellStyle) ){
                try {
                    return Object.assign({},JSON.parse(cellStyle),{
                        'text-align':align
                    }) 
                } catch (error) {
                    console.error(error);
                    alert(error)
                }
            }
        })();

        this.headerName = headerName;
        this.columnGroupShow = columnGroupShow;
        this.headerClass = headerClass;
        this.toolPanelClass = toolPanelClass;
        this.suppressToolPanel = suppressToolPanel;

        this.field = field;
        this.colId = colId;
        this.type = type;
        
        this.width = width;
        this.minWidth = minWidth;
        this.maxWidth = maxWidth;

        this.filter = filter;
        this.filterFramework = filterFramework;
        this.floatingFilterComponent = floatingFilterComponent;
        this.floatingFilterComponentFramework = floatingFilterComponentFramework;
        this.floatingFilterComponentParams = floatingFilterComponentParams;

        this.hide = hide;
        this.pinned = pinned;
        this.lockPosition = lockPosition;
        this.lockVisible = lockVisible;
        this.lockPinned = lockPinned;

        this.sortable = sortable;
        this.sort = sort;
        this.sortedAt = sortedAt;
        this.sortingOrder = sortingOrder;

        this.resizable = resizable;
        this.headerTooltip = headerTooltip;
        this.tooltipField = tooltipField?tooltipField:field;
        this.tooltip = tooltip;
        this.checkboxSelection = checkboxSelection;
        this.rowDrag = rowDrag;
        this.cellClass = cellClass;
        //this.cellStyle = cellStyle;
        this.editable = editable;
        this.onCellValueChanged = onCellValueChanged;
        this.cellRenderer = cellRenderer?cellRenderer:nowCellRender;
        this.cellRendererFramework = cellRendererFramework;
        //this.floatingCellRenderer = floatingCellRenderer;
        //this.floatingCellRendererFramework = floatingCellRendererFramework;
        this.cellRendererSelector = cellRendererSelector;
        this.cellEditor = cellEditor?cellEditor:nowCellEditor;
        this.cellEditorSelector = cellEditorSelector;
        this.cellEditorFramework = cellEditorFramework;
        this.valueGetter = valueGetter;
        this.valueFormatter = valueFormatter?valueFormatter:this.valueFormatter;
        this.headerValueGetter = headerValueGetter;
        this.filterValueGetter = filterValueGetter;
        //this.floatingCellFormatter = floatingCellFormatter;
        this.valueSetter = valueSetter;
        this.valueParser = valueParser;
        this.keyCreator = keyCreator;
        this.getQuickFilterText = getQuickFilterText;
        this.aggFunc = aggFunc;
        this.allowedAggFuncs = allowedAggFuncs;
        this.rowGroupIndex = rowGroupIndex;

        //this.pivotIndex = pivotIndex;
        this.comparator = comparator;
        //this.pivotComparator = pivotComparator;
        this.unSortIcon = unSortIcon;
        //this.enableRowGroup = enableRowGroup;
        //this.enablePivot = enablePivot;

        //this.pivotTotals = pivotTotals;
        //this.enableValue = enableValue;
        this.enableCellChangeFlash = enableCellChangeFlash;
        this.menuTabs = menuTabs;
        this.suppressMenu = suppressMenu;

        this.suppressSizeToFit = suppressSizeToFit;
        this.suppressMovable = suppressMovable;

        this.suppressNavigable = suppressNavigable;
        this.suppressCellFlash = suppressCellFlash;
        this.suppressKeyboardEvent = suppressKeyboardEvent;
        this.onCellClicked = onCellClicked;
        this.onCellDoubleClicked = onCellDoubleClicked;
        this.onCellContextMenu = onCellContextMenu;
        this.autoHeight = autoHeight;
        this.singleClickEdit = singleClickEdit; 
    }
}

