/* eslint-disable */
require('script-loader!file-saver');
require('./Blob');
require('script-loader!xlsx/dist/xlsx.core.min');
// require('script-loader!xlsx-style/dist/xlsx.core.min');
function generateArray(table) {
    var out = [];
    var rows = table.querySelectorAll('tr');
    var ranges = [];
    for (var R = 0; R < rows.length; ++R) {
        var outRow = [];
        var row = rows[R];
        var columns = row.querySelectorAll('td');
        for (var C = 0; C < columns.length; ++C) {
            var cell = columns[C];
            var colspan = cell.getAttribute('colspan');
            var rowspan = cell.getAttribute('rowspan');
            var cellValue = cell.innerText;
            if (cellValue !== "" && cellValue == +cellValue) cellValue = +cellValue;

            //Skip ranges
            ranges.forEach(function (range) {
                if (R >= range.s.r && R <= range.e.r && outRow.length >= range.s.c && outRow.length <= range.e.c) {
                    for (var i = 0; i <= range.e.c - range.s.c; ++i) outRow.push(null);
                }
            });

            //Handle Row Span
            if (rowspan || colspan) {
                rowspan = rowspan || 1;
                colspan = colspan || 1;
                ranges.push({s: {r: R, c: outRow.length}, e: {r: R + rowspan - 1, c: outRow.length + colspan - 1}});
            }
            ;

            //Handle Value
            outRow.push(cellValue !== "" ? cellValue : null);

            //Handle Colspan
            if (colspan) for (var k = 0; k < colspan - 1; ++k) outRow.push(null);
        }
        out.push(outRow);
    }
    return [out, ranges];
};

function datenum(v, date1904) {
    if (date1904) v += 1462;
    var epoch = Date.parse(v);
    return (epoch - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000);
}

function sheet_from_array_of_arrays(data, opts) {
    var ws = {};
    var range = {s: {c: 10000000, r: 10000000}, e: {c: 0, r: 0}};
    for (var R = 0; R != data.length; ++R) {
        for (var C = 0; C != data[R].length; ++C) {
            if (range.s.r > R) range.s.r = R;
            if (range.s.c > C) range.s.c = C;
            if (range.e.r < R) range.e.r = R;
            if (range.e.c < C) range.e.c = C;
            var cell = {v: data[R][C]};
            if (cell.v == null) continue;
            var cell_ref = XLSX.utils.encode_cell({c: C, r: R});

            if (typeof cell.v === 'number') cell.t = 'n';
            else if (typeof cell.v === 'boolean') cell.t = 'b';
            else if (cell.v instanceof Date) {
                cell.t = 'n';
                cell.z = XLSX.SSF._table[14];
                cell.v = datenum(cell.v);
            }
            else cell.t = 's';

            ws[cell_ref] = cell;
        }
    }
    if (range.s.c < 10000000) ws['!ref'] = XLSX.utils.encode_range(range);
    return ws;
}

function Workbook() {
    if (!(this instanceof Workbook)) return new Workbook();
    this.SheetNames = [];
    this.Sheets = {};
}

function s2ab(s) {
    var buf = new ArrayBuffer(s.length);
    var view = new Uint8Array(buf);
    for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
    return buf;
}

export function export_table_to_excel(id) {
    var theTable = document.getElementById(id);
    console.log('a')
    var oo = generateArray(theTable);
    var ranges = oo[1];

    /* original data */
    var data = oo[0];
    var ws_name = "SheetJS";
    console.log(data);

    var wb = new Workbook(), ws = sheet_from_array_of_arrays(data);

    /* add ranges to worksheet */
    // ws['!cols'] = ['apple', 'banan'];
    ws['!merges'] = ranges;

    /* add worksheet to workbook */
    wb.SheetNames.push(ws_name);
    wb.Sheets[ws_name] = ws;

    var wbout = XLSX.write(wb, {bookType: 'xlsx', bookSST: false, type: 'binary'});

    saveAs(new Blob([s2ab(wbout)], {type: "application/octet-stream"}), "test.xlsx")
}

function formatJson(jsonData) {
    console.log(jsonData)
}
export function export_json_to_excel(th, jsonData, defaultTitle) {

    /* original data */

    var data = jsonData;
    data.unshift(th);
    var ws_name = "SheetJS";

    var wb = new Workbook(), ws = sheet_from_array_of_arrays(data);


    /* add worksheet to workbook */
    wb.SheetNames.push(ws_name);
    wb.Sheets[ws_name] = ws;

    var wbout = XLSX.write(wb, {bookType: 'xlsx', bookSST: false, type: 'binary'});
    var title = defaultTitle || '列表'
    saveAs(new Blob([s2ab(wbout)], {type: "application/octet-stream"}), title + ".xlsx")
}

export function export_json_to_excel1 (multiHeader, th, merges, data, defaultTitle, autoWidth, totalList, valLocation, mergeRow) {
    data = [...data];
    data.unshift(th);
    if (mergeRow.length > 0) {
        data.unshift(mergeRow);
    }
    // 根据传入的合计字段数组计算合计行数据
    // 记录合计值
    // 拼接生成合计行
    let trList = []
    let totalObj = {}
    if (totalList.length > 0) {
        th.forEach((item, index) => {
            if (index === 0) {
                trList[0] = '合计'
            } else {
                trList.push('')
            }
        })
        for (let item in valLocation) {
            totalObj[item] = 0
            data.forEach((iItem, index) => {
                if (index !== 0) {
                    totalObj[item] += (iItem[valLocation[item]] - 0)
                }
            })
            trList[valLocation[item]] = totalObj[item]
        }

        data.push(trList)
    }

    // 将合计行添加到头部
    if (multiHeader) {
        data.unshift(multiHeader);
    }
    var ws_name = "SheetJS";

    var wb = new Workbook(),
        ws = sheet_from_array_of_arrays(data);
    /* add worksheet to workbook */
    wb.SheetNames.push(ws_name);
    //合并单元格
    ws["!merges"] = merges;
    wb.Sheets[ws_name] = ws;

    var dataInfo = wb.Sheets[wb.SheetNames[0]];
    var cellArr = merges.map(c => c.s);
    var secArr = merges.map(c => c.e);
    var cellArr1 = [];
    cellArr.forEach(cellObj => {
        var cell_ref = XLSX.utils.encode_cell({
            c: cellObj.c,
            r: cellObj.r
        });
        cellArr1.push(cell_ref);
    });

    //设置单元格样式
    const borderAll = {
        // border: {
        //     //单元格外侧框线
        //     top: {
        //         style: "thin"
        //     },
        //     bottom: {
        //         style: "thin"
        //     },
        //     left: {
        //         style: "thin"
        //     },
        //     right: {
        //         style: "thin"
        //     }
        // },
        alignment: {
            horizontal: "center",
            vertical: "center"
        }
    };
    //给所有单元格加上边框
    for (var i in dataInfo) {
        if (i == '!ref' || i == '!merges' || i == '!cols' || $.inArray(i, cellArr1) >= 0) {
            // console.log(i)
        } else {
            dataInfo[i + ''].s = {
                border: borderAll,
                alignment: {
                    horizontal: 'center',
                    vertical: 'center'
                },
                color: {
                    rgb: "333333"
                },
                font: {
                    name: '微软雅黑',
                    sz: 10,
                    italic: false,
                    underline: false
                }
            }
        }
    }

    if (autoWidth) {
        /*设置worksheet每列的最大宽度*/
        const colWidth = data.map(row =>
            row.map(val => {
                /*先判断是否为null/undefined*/
                if (val == null || val == undefined || val == "") {
                    return {
                        wch: 10
                    };
                } else if (val.toString().charCodeAt(0) > 255) {
                    // console.log(val, val.toString().length * 2, '中文宽度')
                    /*再判断是否为中文*/
                    return {
                        wch: val.toString().length * 2.2
                    };
                } else {
                    return {
                        wch: val.toString().length * 1.5
                    };
                }
            })
        );
        /*以主表第二行为初始值，因为我的第一行是表格标题，会比较长，所以以主表第二行为初始值*/
        let result
        if (mergeRow.length > 0) {
            result = colWidth[1];
        } else {
            result = colWidth[0];
        }

        for (let i = 1; i < colWidth.length; i++) {
            for (let j = 0; j < colWidth[i].length; j++) {
                // console.log('i: ', i, 'j: ',j,result[j],colWidth[i][j]);
                if (result[j]["wch"] < colWidth[i][j]["wch"]) {
                    result[j]["wch"] = colWidth[i][j]["wch"];
                }
            }
        }
        ws["!cols"] = result;
    }

    //设置单元格背景色、字体以及字体大小等
    var bgColArr = ["ffffff", 'ffffff', 'ffffff', 'ffffff', 'ffffff'];
    //设置主标题样式
    var headerStyle = {
        font: {
            name: '宋体',
            color: {
                rgb: "333333"
            },
            bold: true,
            italic: false,
            underline: false
        },
        alignment: {
            horizontal: "center",
            vertical: "center",
        },
        fill: {

        }
    };
    let mm = 0;
    cellArr1.forEach(cellObj => {
        var hStyle = Object.assign({}, headerStyle);
        hStyle.fill = {
            fgColor: {
                rgb: bgColArr[mm]
            }
        };
        dataInfo[cellObj].s = hStyle;
        mm++;
    });

    var secCellStyle = Object.assign({}, borderAll, headerStyle);
    secArr.forEach((s, index) => {
        var hStyle = Object.assign({}, secCellStyle);
        hStyle.fill = {
            fgColor: {
                rgb: bgColArr[index]
            }
        };
        var startIndex = 0;
        if (index == 0) {
            startIndex = 0;
        } else {
            startIndex = secArr[index - 1].c + 1;
        }
        for (var se = startIndex; se <= s.c; se++) {
            var cell_ref = XLSX.utils.encode_cell({
                c: se,
                r: 1
            });
            dataInfo[cell_ref].s = hStyle;
        }
    });

    var wbout = XLSX.write(wb, {
        bookType: 'xlsx',
        bookSST: false,
        type: 'binary'
    });
    var title = defaultTitle || '列表'
    saveAs(new Blob([s2ab(wbout)], {
        type: "application/octet-stream"
    }), title + ".xlsx")
}
