
package de.ivu.elect.business.stimmeingabe.boundary;

import java.util.Objects;
import de.ivu.elect.business.datei.entity.DateiImportBerichtCustomData;
import de.ivu.elect.business.exchange.control.AbstractEntityImporter;
import de.ivu.elect.business.exchange.control.ImportExchange;
import de.ivu.elect.business.stimmeingabe.control.StimmeingabePlausiKonfigurationImportContext;
import de.ivu.elect.business.stimmeingabe.control.StimmeingabePlausiKonfigurationImportExchange;
import de.ivu.elect.business.stimmeingabe.entity.StimmeingabePlausiKonfiguration;
import de.ivu.elect.business.stimmeingabe.entity.StimmeingabePlausiKonfigurationMeta;
import de.ivu.elect.business.stimmeingabe.entity.StimmeingabePlausiKonfigurationTK;
import de.ivu.elect.jee.entity.Meta;
import de.ivu.elect.jee.exchange.ImportOptions;
import de.ivu.elect.jee.exchange.Violations;

import javax.ejb.Stateless;
import javax.inject.Inject;
import java.util.Collection;
import java.util.List;
import java.util.function.Function;

@Stateless
public class StimmeingabePlausiKonfigurationImporter
    extends
      AbstractEntityImporter<StimmeingabePlausiKonfiguration, StimmeingabePlausiKonfigurationTK, StimmeingabePlausiKonfigurationImportContext, DateiImportBerichtCustomData> {

  @Inject
  private transient StimmeingabePlausiKonfigurationDAO stimmeingabePlausiKonfigurationDAO;

  @Inject
  private transient StimmeingabePlausiKonfigurationImportExchange stimmeingabePlausiKonfigurationImportExchange;

  @Inject
  private transient StimmeingabePlausiKonfigurationMeta stimmeingabePlausiKonfigurationMeta;

  @Override
  protected void persistiere(Collection<StimmeingabePlausiKonfiguration> neueEntities, StimmeingabePlausiKonfigurationImportContext stimmeingabePlausiKonfigurationImportContext, DateiImportBerichtCustomData dateiImportBerichtCustomData, StringBuilder bericht) {
    throw new UnsupportedOperationException(); // Plausi-Konfigurationen werden nicht neu angelegt...nur vorhandene aktualisiert
  }

  @Override
  protected void aktualisiere(StimmeingabePlausiKonfiguration entityInDatei, StimmeingabePlausiKonfiguration entityInDatenbank, StimmeingabePlausiKonfigurationImportContext stimmeingabePlausiKonfigurationImportContext, DateiImportBerichtCustomData dateiImportBerichtCustomData, StringBuilder bericht) {
    // NOTE: Mit Default-Plausis abgleichen ist hier implizit gegeben, da die in der DB vorhandenen bereits abgeglichen sind und nur eine Aktualisierung vorhandener stattfindet
    entityInDatenbank.setFehlerart(entityInDatei.getFehlerart());
    entityInDatenbank.setBeschreibung(entityInDatei.getBeschreibung());
    entityInDatenbank.setFehlermeldungFormat(entityInDatei.getFehlermeldungFormat());
    entityInDatenbank.setFehlerschluessel(entityInDatei.getFehlerschluessel());
    entityInDatenbank.setStatus(entityInDatei.getStatus());
    String customDataXmlInDatenbank = entityInDatenbank.getCustomDataXml();
    entityInDatenbank.setCustomDataXml(entityInDatei.getCustomDataXml());
    if (entityInDatenbank.isAttributeChanged() || !Objects.equals(customDataXmlInDatenbank, entityInDatei.getCustomDataXml())) {
      bericht.append(getMessage("stimmeingabe.plausi.konfiguration.import.bericht.veraendert", entityInDatenbank));
    } else {
      bericht.append(getMessage("stimmeingabe.plausi.konfiguration.import.bericht.unveraendert", entityInDatenbank));
    }
    bericht.append("\n");
  }

  @Override
  protected void loescheAusDatenbank(Collection<StimmeingabePlausiKonfiguration> entitiesInDb, StimmeingabePlausiKonfigurationImportContext stimmeingabePlausiKonfigurationImportContext, DateiImportBerichtCustomData dateiImportBerichtCustomData, StringBuilder bericht) {
    throw new UnsupportedOperationException(); // Vorhandene Plausi-Konfigurationen werden nicht aus der Datenbank gelöscht...nur aktualisiert
  }

  @Override
  protected List<StimmeingabePlausiKonfiguration> getAllEntitiesInDB(StimmeingabePlausiKonfigurationImportContext stimmeingabePlausiKonfigurationImportContext) {
    return stimmeingabePlausiKonfigurationDAO.findByWahl(stimmeingabePlausiKonfigurationImportContext.getWahl());
  }

  @Override
  protected Function<StimmeingabePlausiKonfiguration, StimmeingabePlausiKonfigurationTK> getEntityToEntityTKFunction() {
    return StimmeingabePlausiKonfigurationTK.getStimmeingabePlausiKonfigurationToTKFunction();
  }

  @Override
  protected void validiere(Violations violations, List<StimmeingabePlausiKonfiguration> stimmeingabePlausiKonfigurations, StimmeingabePlausiKonfigurationImportContext stimmeingabePlausiKonfigurationImportContext, ImportOptions importOptions) {
    // nichts zu tun
  }

  @Override
  protected void erstelleBericht(List<StimmeingabePlausiKonfiguration> stimmeingabePlausiKonfigurations, StimmeingabePlausiKonfigurationImportContext stimmeingabePlausiKonfigurationImportContext, ImportOptions importOptions, StringBuilder bericht, boolean vorab) {
    // nichts zu tun
  }

  @Override
  protected ImportExchange<List<StimmeingabePlausiKonfiguration>, StimmeingabePlausiKonfigurationImportContext> getExchange() {
    return stimmeingabePlausiKonfigurationImportExchange;
  }

  @Override
  protected Meta getMetaForEntityInternal() {
    return stimmeingabePlausiKonfigurationMeta;
  }
}
