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

import java.io.Serializable;
import java.util.Collections;
import java.util.Date;

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

import de.ivu.elect.business.datei.entity.DateiImportBerichtCustomData;
import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.stimmeingabe.control.StimmeingabeImportContext;
import de.ivu.elect.business.stimmeingabe.entity.Ergebniseingang;
import de.ivu.elect.business.stimmeingabe.entity.ErgebniseingangErfasser;
import de.ivu.elect.business.stimmeingabe.entity.Ergebniseingangsherkunft;
import de.ivu.elect.business.stimmeingabe.entity.Stimmeingabe;
import de.ivu.elect.business.stimmeingabe.entity.ZwischensummeEingabe;

@Stateless
public class ErgebniseingangWiederherstellen implements Serializable {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient ErgebniseingangDAO ergebniseingangDAO;

  @Inject
  private transient StimmeingabeImporter stimmeingabeImporter;

  public ErgebniseingangWiederherstellen() {
    super();
  }

  public void wiederherstellen(Ergebniseingang ergebniseingangNotAttached, ErgebniseingangErfasser erfasser) {
    Ergebniseingang ergebniseingang = ergebniseingangDAO.attach(ergebniseingangNotAttached);

    Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet = ergebniseingang.getWahldurchfuehrungsgebiet();

    Ergebniseingang ergebniseingangKopie = new Ergebniseingang();
    ergebniseingang.copyEntityAttributesUsingSetter(ergebniseingangKopie);
    ergebniseingangKopie.setWahldurchfuehrungsgebiet(wahldurchfuehrungsgebiet);

    for (Stimmeingabe stimmeingabe : ergebniseingang.getStimmeingaben()) {
      Stimmeingabe stimmeingabeKopie;

      if (stimmeingabe.isInstanceOf(ZwischensummeEingabe.class)) {
        stimmeingabeKopie = new ZwischensummeEingabe();
      } else {
        stimmeingabeKopie = new Stimmeingabe();
      }

      stimmeingabe.copyEntityAttributesUsingSetter(stimmeingabeKopie);
      stimmeingabeKopie.setErgebniseingang(ergebniseingangKopie);
      stimmeingabeKopie.setGruppeImGebiet(stimmeingabe.getGruppeImGebiet());
      stimmeingabeKopie.setListenkandidatur(stimmeingabe.getListenkandidatur());
    }

    ergebniseingangKopie.setEingangssequenznummer(null);
    ergebniseingangKopie.setErfasser(erfasser.getKennung());
    ergebniseingangKopie.setZeitstempel(new Date());
    ergebniseingangKopie.setErgebniseingangsherkunft(Ergebniseingangsherkunft.WIEDERHERGESTELLT);
    ergebniseingangKopie.setErgebniseingangsfehlerstatus(null);

    StimmeingabeImportContext context = new StimmeingabeImportContext(wahldurchfuehrungsgebiet.getWahldurchfuehrung(), erfasser);
    DateiImportBerichtCustomData customData = new DateiImportBerichtCustomData();
    StringBuilder bericht = new StringBuilder();

    stimmeingabeImporter.persistiere(Collections.singletonList(ergebniseingangKopie), context, customData, bericht);
  }
}
