
package de.ivu.elect.presentation.exchange.table;

import java.io.InputStream;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import de.ivu.elect.business.datei.boundary.AbstractDateiExportDAO;
import de.ivu.elect.business.datei.entity.Datei;
import de.ivu.elect.business.datei.entity.DateiExport;
import de.ivu.elect.business.konfiguration.control.StreamCreator;
import de.ivu.elect.business.wahl.control.NlHashByteArrayOutputStream;
import de.ivu.elect.business.wahl.entity.NlWahlCustomData;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.jee.faces.Messages;
import de.ivu.elect.jee.presentation.dynamictable.ColumnType;
import de.ivu.elect.presentation.datei.table.AbstractDateiExportColumn;

public class NlDateiExportHashColumn<E extends DateiExport> extends AbstractDateiExportColumn<E> {

  private static final long serialVersionUID = 1L;

  private static final Logger LOG = LoggerFactory.getLogger(NlDateiExportHashColumn.class);

  public NlDateiExportHashColumn(Messages messages, AbstractDateiExportDAO dateiExportDAO, StreamCreator streamCreator) {
    super("NlDateiExportHashColumn", messages, "nl.datei.export.hash.valid", ColumnType.BOOLEAN, dateiExport -> {
      if (dateiExport == null) {
        return null;
      }

      try {
        Datei datei = dateiExportDAO.attach(dateiExport).getDatei();

        Wahl wahl = datei.getWahl();

        if (wahl == null) {
          return false;
        }

        NlWahlCustomData customData = wahl.getCustomData(NlWahlCustomData.class);

        return customData.checkDateiHash(datei.getId(), () -> {
          try (InputStream inputStream = datei.createInputStream(streamCreator)) {
            return NlHashByteArrayOutputStream.sha256(inputStream);
          } catch (Exception ioException) {
            throw new RuntimeException(ioException.getMessage(), ioException);
          }
        });
      } catch (Exception ex) {
        LOG.warn("Fehler beim Berechnen des Hashs: " + ex.getMessage() + ", " + dateiExport, ex);

        return false;
      }
    });
  }
}
