package org.hisp.dhis.integration.converters;

import org.apache.camel.Body;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.hisp.dhis.dxf2.datavalue.DataValue;

import java.io.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ExcelConverterBean {
    //private final static Log log = LogFactory.getLog(ExcelConverterBean.class);

    public List<DataValue> processExcelDataValues(@Body InputStream body) throws IOException {
        List<DataValue> dataValues = new ArrayList<DataValue>();
        try {
            HSSFWorkbook workbook = new HSSFWorkbook(body);
            HSSFSheet sheet = workbook.getSheetAt(0);

            boolean headersFound = false;
            int colNum;
            for(Iterator rit = sheet.rowIterator(); rit.hasNext();) {
                HSSFRow row = (HSSFRow) rit.next();
                if(!headersFound) {  // Skip the first row with column headers
                    headersFound = true;
                    continue;
                }
                colNum = 0;
                DataValue dataValue = new DataValue();
                for(Iterator cit = row.cellIterator(); cit.hasNext(); ++colNum) {
                    HSSFCell cell = (HSSFCell) cit.next();
                    if(headersFound)
                        switch(colNum) {
                            case 0: // dataElement
                                dataValue.setDataElement(cell.getStringCellValue());
                                break;
                            case 1: // period
                                dataValue.setPeriod(String.valueOf(cell.getNumericCellValue()));
                                break;
                            case 2: // orgUnit
                                dataValue.setOrgUnit(cell.getStringCellValue());
                                break;
                            case 3: // value
                                dataValue.setValue(String.valueOf(cell.getNumericCellValue()));
                                break;
                        }
                }
                dataValues.add(dataValue);
            }
        } catch (Exception e) {
            throw new RuntimeException("Unable to import DataValues Excel", e);
        }

        return dataValues;
    }
}
