package com.alibaba.easyexcel.test.core.compatibility;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.poi.ss.usermodel.IndexedColors;
import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;

import com.alibaba.easyexcel.test.util.TestFileUtil;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.metadata.Font;
import com.alibaba.excel.metadata.Sheet;
import com.alibaba.excel.metadata.Table;
import com.alibaba.excel.metadata.TableStyle;
import com.alibaba.excel.parameter.AnalysisParam;
import com.alibaba.excel.parameter.GenerateParam;

/**
 *
 * @author Jiaju Zhuang
 */
public class CompatibilityDataTest {

    private static File file07;
    private static File file03;

    @BeforeClass
    public static void init() {
        file07 = TestFileUtil.createNewFile("compatibility07.xlsx");
        file03 = TestFileUtil.createNewFile("compatibility03.xls");
    }

    @Test
    public void t01ReadAndWrite07() throws Exception {
        readAndWrite(file07);
    }

    @Test
    public void t02ReadAndWrite03() throws Exception {
        readAndWrite(file03);
    }

    private void readAndWrite(File file) throws Exception {
        OutputStream out = new FileOutputStream(file);
        GenerateParam generateParam = new GenerateParam("", null, out);
        generateParam.setSheetName("");
        generateParam.setOutputStream(out);
        generateParam.setClazz(null);
        ExcelWriter writer = new ExcelWriter(generateParam);
        // sheet1 width,string head,string data
        Sheet sheet1 = new Sheet(1, 3);
        sheet1.setSheetName("第一个sheet");
        Map columnWidth = new HashMap();
        columnWidth.put(0, 10000);
        columnWidth.put(1, 50000);
        sheet1.setColumnWidthMap(columnWidth);
        sheet1.setHead(head());
        writer.write1(listData(), sheet1);

        // sheet2 style,class head
        Sheet sheet2 = new Sheet(2, 3, CompatibilityData.class, "第二个sheet", null);
        sheet2.setStartRow(5);
        sheet2.setTableStyle(style());
        writer.write(data(), sheet2);
        writer.merge(8, 8, 0, 1);

        // sheet3 table
        Sheet sheet3 = new Sheet(3, 0);
        sheet3.setSheetName("第三个sheet");

        Table table1 = new Table(1);
        table1.setHead(head());
        writer.write1(listData(), sheet3, table1);

        Table table2 = new Table(2);
        table2.setClazz(CompatibilityData.class);
        writer.write(data(), sheet3, table2);

        writer.finish();
        out.close();

        InputStream inputStream = new FileInputStream(file);
        List<Object> data = EasyExcel.read(inputStream, new Sheet(1, 1));
        Assert.assertEquals(data.size(), 1);
        List<String> dataList = (List<String>)data.get(0);
        Assert.assertEquals(dataList.get(0), "字符串00");
        inputStream.close();

        inputStream = new FileInputStream(file);
        AnalysisParam param = new AnalysisParam(inputStream, null, new Object());
        param.setIn(inputStream);
        param.setExcelTypeEnum(null);
        param.setCustomContent(null);
        ExcelReader excelReader = new ExcelReader(param, new CompatibilityDataListener());
        excelReader.read(new Sheet(2, 6));
        Assert.assertEquals(excelReader.getSheets().size(), 3);
        Assert.assertTrue(excelReader.getAnalysisContext() != null);
        inputStream.close();
    }

    private List<List<String>> head() {
        List<List<String>> list = new ArrayList<List<String>>();
        List<String> head0 = new ArrayList<String>();
        head0.add("字符串标题0");
        List<String> head1 = new ArrayList<String>();
        head1.add("字符串标题1");
        list.add(head0);
        list.add(head1);
        return list;
    }

    private List<List<Object>> listData() {
        List<List<Object>> list = new ArrayList<List<Object>>();
        List<Object> data0 = new ArrayList<Object>();
        data0.add("字符串00");
        data0.add(11);
        list.add(data0);
        return list;
    }

    private List<CompatibilityData> data() {
        List<CompatibilityData> list = new ArrayList<CompatibilityData>();
        for (int i = 0; i < 10; i++) {
            CompatibilityData data = new CompatibilityData();
            data.setString0("字符串0" + i);
            data.setString1("字符串1" + i);
            list.add(data);
        }
        return list;
    }

    public TableStyle style() {
        TableStyle tableStyle = new TableStyle();
        Font headFont = new Font();
        headFont.setBold(true);
        headFont.setFontHeightInPoints((short)22);
        headFont.setFontName("楷体");
        tableStyle.setTableHeadFont(headFont);
        tableStyle.setTableHeadBackGroundColor(IndexedColors.BLUE);

        Font contentFont = new Font();
        contentFont.setBold(true);
        contentFont.setFontHeightInPoints((short)22);
        contentFont.setFontName("黑体");
        tableStyle.setTableContentFont(contentFont);
        tableStyle.setTableContentBackGroundColor(IndexedColors.GREEN);
        return tableStyle;
    }
}