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

import java.util.List;

import javax.ejb.Stateless;
import javax.enterprise.event.Event;
import javax.inject.Inject;

import de.ivu.elect.business.gebietsbaum.boundary.GebietDAO;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gebietsbaum.entity.GebietPK;
import de.ivu.elect.business.protokollierung.entity.LoeschProtokollEvent;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.security.UseCaseSecure;
import de.ivu.elect.business.stimmzettel.control.StimmzettelChangedEvent;
import de.ivu.elect.business.stimmzettel.entity.Stimmzettel;
import de.ivu.elect.business.stimmzettel.entity.StimmzettelDaten;
import de.ivu.elect.business.stimmzettel.entity.StimmzettelDatenFactory;
import de.ivu.elect.business.wahlvorschlag.boundary.WahlvorschlagDAO;
import de.ivu.elect.presentation.gebietsbaum.GebietNummerFormatter;

@Stateless
public class StimmzettelEdit extends AbstractStimmzettelEdit {

  public static final String ABLEHNUNGSGRUND_SEPARATOR = "|";

  @Inject
  private transient StimmzettelDatenFactory stimmzettelDatenFactory;

  @Inject
  private transient EntityAufStimmzettelDatenDAOFactory entityAufStimmzettelDatenDAOFactory;

  @Inject
  private transient GebietDAO gebietDAO;

  @Inject
  private transient WahlvorschlagDAO wahlvorschlagDAO;

  @Inject
  private transient StimmzettelPruefer stimmzettelPruefer;

  @Inject
  private transient Event<StimmzettelChangedEvent> stimmzettelChangedEventEvent;

  @Inject
  private transient LoeschProtokollEvent loeschProtokollEvent;

  @Inject
  private transient GebietNummerFormatter gebietNummerFormatter;

  public StimmzettelEdit() {
    super();
  }

  public StimmzettelDaten getStimmzettelDaten(Gebiet gebietNotAttached) {
    Gebiet gebiet = gebietDAO.attach(gebietNotAttached);

    return stimmzettelDatenFactory.create(entityAufStimmzettelDatenDAOFactory.getEntityAufStimmzettelDaten(), gebiet,
        wahlvorschlagDAO.findByWahl(gebiet.getWahl()));
  }

  @Override
  public void save(Stimmzettel entity) {
    stimmzettelPruefer.pruefeStimmzettel(entity);
    entity.setVersionsnummer(entity.getVersionsnummer() + 1);
    super.save(entity);
    stimmzettelChangedEventEvent.fire(new StimmzettelChangedEvent(entity.getGebiet().getPk()));
  }

  @Override
  public void delete(Stimmzettel entity) {
    Stimmzettel attachedEntity = getAttachedEntity(entity);
    loeschProtokollEvent.sendeLoeschProtokollEvent(attachedEntity.getWahl(), attachedEntity, "loesch.protokoll.stimmzettel",
        gebietNummerFormatter.getDarstellung(attachedEntity.getGebiet()), attachedEntity.getNummer());

    GebietPK gebietPK = entity.getGebiet().getPk();
    super.delete(entity);
    stimmzettelChangedEventEvent.fire(new StimmzettelChangedEvent(gebietPK)); // ELECTKOM-2695
  }

  @UseCaseSecure(UseCasePermission.STIMMZETTEL_BULK_DELETE)
  public void deleteSearched(List<Stimmzettel> stimmzettelList) {
    for (Stimmzettel stimmzettel : dao.attachAll(stimmzettelList)) {
      delete(stimmzettel);
    }
  }

}
