
package de.ivu.elect.presentation.exchange;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.enterprise.context.RequestScoped;
import javax.inject.Inject;
import javax.inject.Named;

import de.ivu.elect.business.datei.boundary.CsvDateiConversationSelect;
import de.ivu.elect.business.datei.control.CsvDateiLeser;
import de.ivu.elect.business.datei.entity.CsvDatei;
import de.ivu.elect.jee.presentation.dynamictable.ColumnModel;

@Named
@RequestScoped
public class CsvPreviewView {

  private static final int DEFAULT_PREVIEW_LINES = 5;

  @Inject
  private transient CsvDateiConversationSelect csvDateiSelect;

  @Inject
  private transient CsvDateiLeser csvDateiLeser;

  public CsvPreviewView() {
    super();
  }

  public List<ColumnModel> getColumns() throws IOException {
    CsvDatei csvDatei = getSelectedCsvDatei();

    List<String[]> previewData = liesDatenAlsCsvDatei(csvDatei);

    return createColumns(previewData.get(0), csvDatei.getAnzahlKopfzeilen().intValue());
  }

  public List<String[]> getPreviewData() throws IOException {
    CsvDatei csvDatei = getSelectedCsvDatei();

    List<String[]> previewData = liesDatenAlsCsvDatei(csvDatei);

    int anzahlKopfzeilen = csvDatei.getAnzahlKopfzeilen().intValue();

    previewData = previewData.subList(anzahlKopfzeilen, previewData.size());

    return previewData;
  }

  private List<ColumnModel> createColumns(String[] columnsRow, int anzahlKopfzeilen) {
    List<ColumnModel> columns = new ArrayList<>();

    for (int i = 0; i < columnsRow.length; i++) {
      if (anzahlKopfzeilen > 0L) {
        columns.add(new ColumnModel(columnsRow[i], String.valueOf(i)));
      } else {
        columns.add(new ColumnModel(String.valueOf(i), String.valueOf(i)));
      }
    }

    return columns;
  }

  private List<String[]> liesDatenAlsCsvDatei(CsvDatei currentCsvDatei) throws IOException {
    return csvDateiLeser.liesDatenAlsCsvDatei(currentCsvDatei, DEFAULT_PREVIEW_LINES + currentCsvDatei.getAnzahlKopfzeilen().intValue());
  }

  private CsvDatei getSelectedCsvDatei() {
    return csvDateiSelect.getEntity();
  }
}
