import server from '../controllers/server';
import { luckysheetlodingHTML, luckyColor } from '../controllers/constant';
import sheetmanage from '../controllers/sheetmanage';
import luckysheetformula from './formula';
import imageCtrl from '../controllers/imageCtrl';
import dataVerificationCtrl from '../controllers/dataVerificationCtrl';
import pivotTable from '../controllers/pivotTable';
import luckysheetFreezen from '../controllers/freezen';
import { getSheetIndex } from '../methods/get';
import { luckysheetextendData } from './extend';
import luckysheetConfigsetting from '../controllers/luckysheetConfigsetting';
import editor from './editor';
import luckysheetcreatesheet from './createsheet';
import Store from '../store';

const defaultConfig = {
    defaultStore:{
        container: null, 
        luckysheetfile: null, 
        defaultcolumnNum: 60, 
        defaultrowNum: 84, 
        fullscreenmode: true,
        devicePixelRatio: 1,
    
        currentSheetIndex: 0,
        calculateSheetIndex: 0,
        flowdata: [],
        config: {},
    
        visibledatarow: [],
        visibledatacolumn: [],
        ch_width: 0,
        rh_height: 0,
    
        cellmainWidth: 0,
        cellmainHeight: 0,
        toolbarHeight: 0,
        infobarHeight: 0,
        calculatebarHeight: 0,
        rowHeaderWidth: 46,
        columnHeaderHeight: 20,
        cellMainSrollBarSize: 12,
        sheetBarHeight: 31,
        statisticBarHeight: 23,
        luckysheetTableContentHW: [0, 0], 
    
        defaultcollen: 73,
        defaultrowlen: 19,
    
        jfcountfuncTimeout: null, 
        jfautoscrollTimeout: null,
    
        luckysheet_select_status: false,
        luckysheet_select_save: [{ "row": [0, 0], "column": [0, 0] }],
        luckysheet_selection_range: [],
    
        luckysheet_copy_save: {}, //复制粘贴
        luckysheet_paste_iscut: false,
    
        filterchage: true, //筛选
        luckysheet_filter_save: { "row": [], "column": [] },
    
        luckysheet_sheet_move_status: false,
        luckysheet_sheet_move_data: [],
        luckysheet_scroll_status: false,
    
        luckysheetisrefreshdetail: true,
        luckysheetisrefreshtheme: true,
        luckysheetcurrentisPivotTable: false,
    
        luckysheet_rows_selected_status: false,  //行列标题相关参
        luckysheet_cols_selected_status: false,  
        luckysheet_rows_change_size: false,
        luckysheet_rows_change_size_start: [],
        luckysheet_cols_change_size: false,
        luckysheet_cols_change_size_start: [],
        luckysheet_cols_dbclick_timeout: null,
        luckysheet_cols_dbclick_times: 0,
    
        luckysheetCellUpdate: [],
        
        luckysheet_shiftpositon: null,
    
        iscopyself: true,
    
        orderbyindex: 0, //排序下标
    
        luckysheet_model_move_state: false, //模态框拖动
        luckysheet_model_xy: [0, 0],
        luckysheet_model_move_obj: null,
    
        luckysheet_cell_selected_move: false,  //选区拖动替换
        luckysheet_cell_selected_move_index: [],
    
        luckysheet_cell_selected_extend: false,  //选区下拉
        luckysheet_cell_selected_extend_index: [],
        luckysheet_cell_selected_extend_time: null,
    
        clearjfundo: true,
        jfredo: [],
        jfundo: [],
        lang: 'en', //language
        createChart: '',
        highlightChart: '',
        zIndex: 15,
        chartparam: {
            luckysheetCurrentChart: null, //current chart_id
            luckysheetCurrentChartActive: false,
            luckysheetCurrentChartMove: null, // Debounce state
            luckysheetCurrentChartMoveTimeout: null,//拖动图表框的节流定时器
            luckysheetCurrentChartMoveObj: null, //chart DOM object
            luckysheetCurrentChartMoveXy: null, //上一次操作结束的图表信息,x,y: chart框位置,scrollLeft1,scrollTop1: 滚动条位置
            luckysheetCurrentChartMoveWinH: null, //左右滚动条滑动距离
            luckysheetCurrentChartMoveWinW: null, //上下滚动条滑动距离
            luckysheetCurrentChartResize: null,
            luckysheetCurrentChartResizeObj: null,
            luckysheetCurrentChartResizeXy: null,
            luckysheetCurrentChartResizeWinH: null,
            luckysheetCurrentChartResizeWinW: null,
            luckysheetInsertChartTosheetChange: true, // 正在执行撤销
            luckysheetCurrentChartZIndexRank : 100,
            luckysheet_chart_redo_click:false, //撤销重做时标识
            luckysheetCurrentChartMaxState: false, //图表全屏状态
            jfrefreshchartall: '',
            changeChartCellData: '',
            renderChart: '',
            getChartJson: ''
        },
        functionList:null, //function list explanation
        luckysheet_function:null,
        chart_selection: {},
        currentChart: '',
        scrollRefreshSwitch:true,
    
        measureTextCache:{},
        measureTextCellInfoCache:{},
        measureTextCacheTimeOut:null,
        cellOverflowMapCache:{},
    
        zoomRatio:1,
    
        visibledatacolumn_unique:null,
        visibledatarow_unique:null,
    
        showGridLines:true,
    
        toobarObject: {}, //toolbar constant
        inlineStringEditCache:null,
        inlineStringEditRange:null,
    
        fontList:[],

        currentSheetView:"viewNormal",
    
    },    
    defaultFormula:{
        searchFunctionCell: null,
        functionlistPosition: {},
        rangechangeindex: null,
        rangestart: false,
        rangetosheet: null,
        rangeSetValueTo: null,
        func_selectedrange: {}, //函数选区范围
        rangedrag_column_start: false,
        rangedrag_row_start: false,
        rangeResizeObj: null,
        rangeResize: null,
        rangeResizeIndex: null,
        rangeResizexy: null,
        rangeResizeWinH: null,
        rangeResizeWinW: null,
        rangeResizeTo: null,
        rangeMovexy: null,
        rangeMove: false,
        rangeMoveObj: null,
        rangeMoveIndex: null,
        rangeMoveRangedata: null,
        functionHTMLIndex: 0,
        functionRangeIndex: null,
        execvertex: {},
        execFunctionGroupData: null,
        execFunctionExist: null,
        formulaContainSheetList:{},
        cellTextToIndexList:{},
        isFunctionRangeSave: false,
        execvertex: {},
        execFunctionGroupData: null,
        execFunctionExist: null,
        formulaContainSheetList:{},
        formulaContainCellList:{},
        cellTextToIndexList:{},
        execFunctionGlobalData:{},
        groupValuesRefreshData: [],
        functionResizeData: {},
        functionResizeStatus: false,
        functionResizeTimeout: null,
        data_parm_index: 0  //选择公式后参数索引标记
    },
    defaultSheet:{
        sheetMaxIndex: 0,
        nulldata: null,
        mergeCalculationSheet:{},
        checkLoadSheetIndexToDataIndex:{},
        CacheNotLoadControll:[],
    },
    defaultPivotTable:{
        pivotDatas: null,
        pivotSheetIndex: 0,
        pivotDataSheetIndex: 0,
        celldata: null,
        origindata: null,
        pivot_data_type: {},
        pivot_select_save: null,
        column: null,
        row: null,
        values: null,
        filter: null,
        showType: null,
        rowhidden: null,
        selected: null,
        caljs: null,
        initial: true,
        filterparm: null,
        luckysheet_pivotTable_select_state: false,
        jgridCurrentPivotInput: null,
        movestate: false,
        moveitemposition: [],
        movesave: {},
        drawPivotTable: true,
        pivotTableBoundary: [12, 6],
    },
    defaultImage:{
        imgItem: {
            type: '3',  //1移动并调整单元格大小 2移动并且不调整单元格的大小 3不要移动单元格并调整其大小
            src: '',  //图片url
            originWidth: null,  //图片原始宽度
            originHeight: null,  //图片原始高度
            default: {
                width: null,  //图片 宽度
                height: null,  //图片 高度
                left: null,  //图片离表格左边的 位置
                top: null,  //图片离表格顶部的 位置
            },
            crop: {
                width: null,  //图片裁剪后 宽度
                height: null,  //图片裁剪后 高度
                offsetLeft: 0,  //图片裁剪后离未裁剪时 左边的位移
                offsetTop: 0,  //图片裁剪后离未裁剪时 顶部的位移
            },
            isFixedPos: false,  //固定位置
            fixedLeft: null,  //固定位置 左位移
            fixedTop: null,  //固定位置 右位移
            border: {
                width: 0,  //边框宽度
                radius: 0,  //边框半径
                style: 'solid',  //边框类型
                color: '#000',  //边框颜色
            }
        },
        images: null,
        currentImgId: null,
        currentWinW: null,
        currentWinH: null,
        resize: null,  
        resizeXY: null,
        move: false,
        moveXY: null,
        cropChange: null,  
        cropChangeXY: null,
        cropChangeObj: null,
        copyImgItemObj: null,
    },
    defaultDataVerification:{
        defaultItem: {
            type: 'dropdown',  //类型
            type2: null,  //
            value1: '',  //
            value2: '',  //
            checked: false,
            remote: false,  //自动远程获取选项
            prohibitInput: false,  //输入数据无效时禁止输入
            hintShow: false,  //选中单元格时显示提示语
            hintText: '',  //
        },
        curItem: null,
        dataVerification: null,
        selectRange: [],
        selectStatus: false,
    }
}

const method = {
    //翻页
    addDataAjax: function(param, index, url, func){
        let _this = this;

        if(index == null){
            index = Store.currentSheetIndex;
        }

        if(url == null){
            url = server.loadSheetUrl;
        }

        $("#luckysheet-grid-window-1").append(luckysheetlodingHTML());
        param.currentPage++;
        
        let dataType = 'application/json;charset=UTF-8';
        let token = sessionStorage.getItem('x-auth-token');

        $.ajax({
            method: 'POST',
            url: url,
            headers: { "x-auth-token": token },
            data: JSON.stringify(param),
            contentType: dataType,
            success: function(d) {
                //d可能为json字符串
                if(typeof d == "string"){
                    d = JSON.parse(d);
                }

                let dataset = d.data;
                
                let newData = dataset.celldata;
                luckysheetextendData(dataset["row"], newData);

                setTimeout(function(){
                    Store.loadingObj.close()
                }, 500);

                if(func && typeof(func)=="function"){ 
                    func(dataset);
                }
            }
        })
    },
    //重载
    reload: function(param, index, url, func){
        let _this = this;

        if(index == null){
            index = Store.currentSheetIndex;
        }

        if(url == null){
            url = server.loadSheetUrl;
        }

        $("#luckysheet-grid-window-1").append(luckysheetlodingHTML());

        let arg = {"gridKey" : server.gridKey, "index": index};
        param = $.extend(true, param, arg);
        let file = Store.luckysheetfile[getSheetIndex(index)];

        $.post(url, param, function (d) {
            let dataset = new Function("return " + d)();
            file.celldata = dataset[index.toString()];
            let data = sheetmanage.buildGridData(file);

            setTimeout(function(){
                Store.loadingObj.close()
            }, 500);

            file["data"] = data;
            Store.flowdata = data;
            editor.webWorkerFlowDataCache(data);//worker存数据

            luckysheetcreatesheet(data[0].length, data.length, data, null, false);
            file["load"] = "1";

            Store.luckysheet_select_save.length = 0;
            Store.luckysheet_selection_range = [];

            server.saveParam("shs", null, Store.currentSheetIndex);

            sheetmanage.changeSheet(index);

            if(func && typeof(func)=="function"){ 
                func();
            }
        });
    },
    clearSheetByIndex: function(i){
        let index = getSheetIndex(i);
        let sheetfile = Store.luckysheetfile[index];

        if(!sheetfile.isPivotTable){
            sheetfile.data = [];
            sheetfile.row = Store.defaultrowNum;
            sheetfile.column = Store.defaultcolumnNum;

            sheetfile.chart = [];
            sheetfile.config = null;
            sheetfile.filter = null;
            sheetfile.filter_select = null;
            sheetfile.celldata = [];
            sheetfile.pivotTable = {};
            sheetfile.calcChain = [];
            sheetfile.status = 0;
            sheetfile.load = 0;

            Store.flowdata = [];
            editor.webWorkerFlowDataCache(Store.flowdata);//worker存数据

            $("#"+ Store.container +" .luckysheet-data-visualization-chart").remove();
            $("#"+ Store.container +" .luckysheet-datavisual-selection-set").remove();

            $("#luckysheet-row-count-show, #luckysheet-formula-functionrange-select, #luckysheet-row-count-show, #luckysheet-column-count-show, #luckysheet-change-size-line, #luckysheet-cell-selected-focus, #luckysheet-selection-copy, #luckysheet-cell-selected-extend, #luckysheet-cell-selected-move, #luckysheet-cell-selected").hide();

            delete sheetfile.load;
        }
        else {
            delete Store.luckysheetfile[index];
        }
    },
    clear: function(index){
        let _this = this;

        if(index == "all"){
            for(let i = 0; i < Store.luckysheetfile.length; i++){
                let sheetfile = Store.luckysheetfile[i];
                _this.clearSheetByIndex(sheetfile.index);
            }
            
        }
        else{
            if(index == null){
                index = Store.currentSheetIndex;
            }
            _this.clearSheetByIndex(index);
        }

        sheetmanage.changeSheet(Store.luckysheetfile[0].index);
    },
    destroy:function(){
        $("#" + Store.container).empty();
        $("body > .luckysheet-cols-menu").remove();

        $("#luckysheet-modal-dialog-mask, #luckysheetTextSizeTest, #luckysheet-icon-morebtn-div").remove();
        $("#luckysheet-input-box").parent().remove();
        $("#luckysheet-formula-help-c").remove();
        $(".chartSetting, .luckysheet-modal-dialog-slider").remove();

        //document event release
        $(document).off(".luckysheetEvent");
        $(document).off(".luckysheetProtection");
        
        //参数重置
        luckysheetFreezen.initialHorizontal = true;
        luckysheetFreezen.initialVertical = true;

        let defaultStore = $.extend(true, {}, defaultConfig.defaultStore);
        for(let key in defaultStore){
            if(key in Store){
                Store[key] = defaultStore[key];
            }
        }

        let defaultFormula = $.extend(true, {}, defaultConfig.defaultFormula);
        for(let key in defaultFormula){
            if(key in luckysheetformula){
                luckysheetformula[key] = defaultFormula[key];
            }
        }

        let defaultSheet = $.extend(true, {}, defaultConfig.defaultSheet);
        for(let key in defaultSheet){
            if(key in sheetmanage){
                sheetmanage[key] = defaultSheet[key];
            }
        }

        let defaultPivotTable = $.extend(true, {}, defaultConfig.defaultPivotTable);
        for(let key in defaultPivotTable){
            if(key in pivotTable){
                pivotTable[key] = defaultPivotTable[key];
            }
        }

        let defaultImage = $.extend(true, {}, defaultConfig.defaultImage);
        for(let key in defaultImage){
            if(key in imageCtrl){
                imageCtrl[key] = defaultImage[key];
            }
        }

        let defaultDataVerification = $.extend(true, {}, defaultConfig.defaultDataVerification);
        for(let key in defaultDataVerification){
            if(key in dataVerificationCtrl){
                dataVerificationCtrl[key] = defaultDataVerification[key];
            }
        }

        // remove proxy
        Store.asyncLoad = ['core'];
    },
    editorChart:function(c){
        let chart_selection_color = luckyColor[0];
        let chart_id = "luckysheetEditMode-datav-chart";
        let chart_selection_id = chart_id + "_selection";
        c.chart_id = chart_id;
        let chartTheme = c.chartTheme;
        chartTheme = chartTheme == null ? "default0000" : chartTheme;

        luckysheet.insertChartTosheet(c.sheetIndex, c.dataSheetIndex, c.option, c.chartType, c.selfOption, c.defaultOption, c.row, c.column, chart_selection_color, chart_id, chart_selection_id, c.chartStyle, c.rangeConfigCheck, c.rangeRowCheck, c.rangeColCheck, c.chartMarkConfig, c.chartTitleConfig, c.winWidth, c.winHeight, c.scrollLeft, c.scrollTop, chartTheme, c.myWidth, c.myHeight, c.myLeft!=null?parseFloat(c.myLeft):null, c.myTop!=null?parseFloat(c.myTop):null, c.myindexrank, true);

        $("#"+chart_id).find(".luckysheet-modal-controll-update").click();
    },
    /**
     * 获取单元格的值
     * @param {name} 函数名称
     * @param {arguments} 函数参数
     */
    createHookFunction:function(){
        let hookName = arguments[0];
        if(luckysheetConfigsetting.hook && luckysheetConfigsetting.hook[hookName]!=null && (typeof luckysheetConfigsetting.hook[hookName] == "function")){
            var args = Array.prototype.slice.apply(arguments);
            args.shift();
            let ret = luckysheetConfigsetting.hook[hookName].apply(this, args);
            if(ret===false){
                return false;
            }
            else{
                return true;
            }
        }

        return true;
    }

}

export default method;