package com.zjrs.appcomm.template.excel.mapper;

import com.zjrs.appcomm.template.excel.exception.IllegalHeaderException;
import com.zjrs.appcomm.template.excel.util.ExcelUtils;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.springframework.util.StringUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * Excel表头Mapper
 * @author froms
 *
 */
public interface StringHeaderMapper extends HeaderMapper {
	/**
	 * 根据传入的表头名称转换为字段的字段名。
	 * 返回的数组长度与传入的数组长度可以不一致：
	 * 比如当传入的末尾若干表头是不需要的时，则可以对数组长度进行裁剪至自己需要的长度；
	 * 比如当传入的开头或中间若干表头是不需要的时，则可以对相应下标填写空
	 * @param titles 从Excel中解析出的表头数组
	 * @return 实际映射数据需要的字段名数组
	 * @throws IllegalHeaderException 当发现异常的表头时抛出该异常
	 */
	public String[] mapper(String[] headers) throws IllegalHeaderException;
	
	@Override
	default String[] mapper(Row[] rows) throws IllegalHeaderException {
		List<String> headerList = new ArrayList<>();
		for (Row headerRow: rows) {
			if (headerRow == null) {
				throw new IllegalHeaderException();
			}
			for (int j = 0; j < headerRow.getLastCellNum(); j++) {
				Cell cell = ExcelUtils.getCell(headerRow, j, false);
				String value = null;
				if (cell != null) {
					value = ExcelUtils.getStringCellValue(cell);
				}
				if (j == headerList.size()) {
					headerList.add(value);
				} else if (j < headerList.size()) {
					if (!StringUtils.isEmpty(value)) {
						headerList.set(j, value);
					}
				} else {
					throw new AssertionError("分析表头出错");
				}
			}
		}
		String[] headers = new String[headerList.size()];
		headerList.toArray(headers);
		return mapper(headers);
	}
}
