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

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.function.Function;

import javax.ejb.Stateless;
import javax.inject.Inject;

import de.ivu.elect.business.benutzerverwaltung.control.RolleCreate;
import de.ivu.elect.business.benutzerverwaltung.control.RolleImportExchange;
import de.ivu.elect.business.benutzerverwaltung.entity.Rolle;
import de.ivu.elect.business.benutzerverwaltung.entity.RolleExchangeContext;
import de.ivu.elect.business.benutzerverwaltung.entity.RolleMeta;
import de.ivu.elect.business.benutzerverwaltung.entity.RolleTK;
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.security.boundary.RolleCreator;
import de.ivu.elect.jee.entity.Meta;
import de.ivu.elect.jee.exchange.ImportOptions;
import de.ivu.elect.jee.exchange.Violations;

@Stateless
public class RolleImporter extends AbstractEntityImporter<Rolle, RolleTK, RolleExchangeContext, DateiImportBerichtCustomData> {

  @Inject
  private transient RolleImportExchange rolleImportExchange;

  @Inject
  private transient RolleMeta rolleMeta;

  @Inject
  private transient RolleDAO rolleDao;

  @Inject
  private transient RolleCreate rolleCreate;

  @Inject
  private transient RolleCreator rolleCreator;

  @Override
  protected void postImportActions(List<Rolle> rolles, RolleExchangeContext context, ImportOptions importOptions,
      DateiImportBerichtCustomData customDateiImportBericht, StringBuilder bericht) {
    super.postImportActions(rolles, context, importOptions, customDateiImportBericht, bericht);

    rolleDao.flush();

    rolleCreator.aktualisiereAdminRolle(context.getMandant()); // ELECT-5594
    rolleCreator.cleanUpRollen(context.getMandant()); // WASDE-1089
  }

  @Override
  protected void persistiere(final Collection<Rolle> neueRollen, RolleExchangeContext context,
      DateiImportBerichtCustomData dateiImportBerichtCustomData, StringBuilder bericht) {
    for (Rolle rolle : neueRollen) {
      rolle.setMandant(context.getMandant());
      rolleCreate.save(rolle);
    }
  }

  @Override
  protected void aktualisiere(final Rolle entityInDatei, final Rolle entityInDatenbank, RolleExchangeContext context,
      DateiImportBerichtCustomData dateiImportBerichtCustomData, StringBuilder bericht) {
    entityInDatenbank.setName(entityInDatei.getName());
    entityInDatenbank.setBeschreibung(entityInDatei.getBeschreibung());
    entityInDatenbank.removeAllRechts();
    entityInDatenbank.addPermissions(new ArrayList<>(entityInDatei.getRecht()));
  }

  @Override
  protected void loescheAusDatenbank(final Collection<Rolle> entitiesInDb, RolleExchangeContext context,
      DateiImportBerichtCustomData dateiImportBerichtCustomData, StringBuilder bericht) {
    for (Rolle rolle : entitiesInDb) {
      rolleDao.remove(rolle);
    }
  }

  @Override
  protected List<Rolle> getAllEntitiesInDB(RolleExchangeContext context) {
    return rolleDao.findByAll(context.getMandant());
  }

  @Override
  protected Function<Rolle, RolleTK> getEntityToEntityTKFunction() {
    return RolleTK.getRolleToTKFunction();
  }

  @Override
  protected void validiere(Violations violations, List<Rolle> rollen, RolleExchangeContext context, ImportOptions importOptions) {
    for (Rolle rolle : rollen) {
      validateEntity(violations, rolle, rolle.getRolleTK());
    }
  }

  @Override
  protected ImportExchange<List<Rolle>, RolleExchangeContext> getExchange() {
    return rolleImportExchange;
  }

  @Override
  public Meta getMetaForEntityInternal() {
    return rolleMeta;
  }

  @Override
  protected void erstelleBericht(List<Rolle> importObject, RolleExchangeContext context, ImportOptions importOptions,
      StringBuilder bericht, boolean vorab) {
    // nichts zu tun
  }
}
