package cn.report.excel.easyexcel.custom;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.poi.ss.usermodel.Cell;
import org.springframework.util.CollectionUtils;
import cn.report.excel.easyexcel.api.enums.CellDataTypeEnum;
import cn.report.excel.easyexcel.api.metadata.data.WriteCellData;
import cn.report.excel.easyexcel.api.util.MapUtils;
import cn.report.excel.easyexcel.api.metadata.Head;
import cn.report.excel.easyexcel.api.write.metadata.holder.WriteSheetHolder;
import cn.report.excel.easyexcel.api.write.style.column.AbstractColumnWidthStyleStrategy;

/***
 * 列宽： 自适应列宽
 * 
 * 系统统一列宽：.registerWriteHandler(new SimpleColumnWidthStyleStrategy(25))
 * 如需设置自动列宽则new LongestMatchColumnWidthStyleStrategy()
 */
public class SamCellWidthWriteHandler extends AbstractColumnWidthStyleStrategy
{
    private static final int MAX_COLUMN_WIDTH = 255;
    private final Map<Integer, Map<Integer, Integer>> cache = MapUtils.newHashMapWithExpectedSize(8);
	
	private Integer dataLength(List<WriteCellData<?>> cellDataList, Cell cell, Boolean isHead) {
		if (isHead && cell.getRowIndex() == 1) {
			return cell.getStringCellValue().getBytes().length;
		}
		else {
			WriteCellData<?> cellData = cellDataList.get(0);
			CellDataTypeEnum type = cellData.getType();
			if (type == null) {
				return -1;
			} else {
				switch (type) {
				case STRING:
					return cellData.getStringValue().getBytes().length;
				case BOOLEAN:
					return cellData.getBooleanValue().toString().getBytes().length;
				case NUMBER:
					return cellData.getNumberValue().toString().getBytes().length;
				default:
					return -1;
				}
			}
		}
	}
	@Override
	protected void setColumnWidth(
			WriteSheetHolder writeSheetHolder, 
			List<WriteCellData<?>> cellDataList, 
			Cell cell,Head head,
			Integer relativeRowIndex, Boolean isHead) 
	{
		boolean needSetWidth = isHead || !CollectionUtils.isEmpty(cellDataList);
		if (!needSetWidth) {
			return;
		}
		Map<Integer, Integer> maxColumnWidthMap = cache.get(writeSheetHolder.getSheetNo());
		if (maxColumnWidthMap == null) {
			maxColumnWidthMap = new HashMap<Integer, Integer>(16);
			cache.put(writeSheetHolder.getSheetNo(), maxColumnWidthMap);
		}
		Integer columnWidth = dataLength(cellDataList, cell, isHead);
		if (columnWidth < 0) {
			return;
		}
		if (columnWidth > MAX_COLUMN_WIDTH) {
			columnWidth = MAX_COLUMN_WIDTH;
		}
		Integer maxColumnWidth = maxColumnWidthMap.get(cell.getColumnIndex());
		if (maxColumnWidth == null || columnWidth > maxColumnWidth) {
			maxColumnWidthMap.put(cell.getColumnIndex(), columnWidth);
			writeSheetHolder.getSheet().setColumnWidth(cell.getColumnIndex(), columnWidth * 256);
		}
	}
	
}