
package de.ivu.elect.business.gebietsbaum.control;

import java.util.List;

import javax.inject.Inject;

import de.ivu.elect.business.benutzerverwaltung.boundary.RolleDAO;
import de.ivu.elect.business.benutzerverwaltung.boundary.RolleEdit;
import de.ivu.elect.business.benutzerverwaltung.entity.Rolle;
import de.ivu.elect.business.gebietsbaum.boundary.GebietsartDAO;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.kandidatenportal.control.WvpWahlkonfigurationAktualisierenEvent;
import de.ivu.elect.business.mandant.boundary.MandantDAO;
import de.ivu.elect.business.wahl.boundary.WahlterminDAO;
import de.ivu.elect.business.wahl.control.WahlAttacher;
import de.ivu.elect.business.wahl.entity.Wahl;

public class GebietCreate extends AbstractGebietCreate {

  @Inject
  private transient WahlterminDAO wahlterminDAO;

  @Inject
  private transient WahlAttacher wahlAttacher;

  @Inject
  private transient GebietsartDAO gebietsartDAO;

  @Inject
  private transient MandantDAO mandantDAO;

  @Inject
  private transient RolleDAO rolleDAO;

  @Inject
  private transient RolleEdit rolleEdit;

  @Inject
  private transient WvpWahlkonfigurationAktualisierenEvent wvpWahlkonfigurationAktualisierenEvent;

  public GebietCreate() {
    super();
  }

  @Override
  public void save(Gebiet entity) {
    entity.setWahl(wahlAttacher.attach(entity.getWahl()));
    entity.setWahltermin(wahlterminDAO.attach(entity.getWahltermin()));
    Gebiet uebergeordnetesGebiet = entity.getUebergeordnetesGebiet();
    entity.setUebergeordnetesGebietOhneUpdateBeziehung(null); // ELECT-8157
    entity.setGebietsart(gebietsartDAO.attach(entity.getGebietsart()));
    entity.setVerantwortlicherMandant(mandantDAO.attach(entity.getVerantwortlicherMandant()));

    // ELECTKOM-455
    if (entity.getWahltermin()!=null && entity.getEinsehenRolle()!=null && !entity.getEinsehenRolle().isPersistent() && entity.getEinsehenRolle().getMandant()==null) {
      List<Rolle> byName = rolleDAO.findByName(entity.getWahltermin().getMandant(), entity.getEinsehenRolle().getName());
      if (byName.isEmpty()) {
        entity.getEinsehenRolle().setMandant(entity.getWahltermin().getMandant());
      } else {
        entity.setEinsehenRolle(byName.iterator().next());
      }
    }
    if (entity.getWahltermin()!=null && entity.getBearbeitenRolle()!=null && !entity.getBearbeitenRolle().isPersistent() && entity.getBearbeitenRolle().getMandant()==null) {
      List<Rolle> byName = rolleDAO.findByName(entity.getWahltermin().getMandant(), entity.getBearbeitenRolle().getName());
      if (byName.isEmpty()) {
        entity.getBearbeitenRolle().setMandant(entity.getWahltermin().getMandant());
      } else {
        entity.setBearbeitenRolle(byName.iterator().next());
      }
    }

    // ELECTKOM-313
    if (entity.getEinsehenRolle()!=null && entity.getEinsehenRolle().isPersistent()) {
      entity.setEinsehenRolle(rolleDAO.attach(entity.getEinsehenRolle()));
    }
    if (entity.getBearbeitenRolle()!=null && entity.getBearbeitenRolle().isPersistent()) {
      entity.setBearbeitenRolle(rolleDAO.attach(entity.getBearbeitenRolle()));
    }

    //ELECT-8130 nur ein Wurzelgebiet
    if (uebergeordnetesGebiet == null) {
      EntityMitWurzelgebiet entityMitWurzelgebiet = entity.getWahl();
      if (entityMitWurzelgebiet == null) {
        entityMitWurzelgebiet = entity.getWahltermin();
      }

      Gebiet vorhandenesWurzelgebiet = entityMitWurzelgebiet.getWurzelgebiet(EntityMitWurzelgebietDAO.fromDao(dao));
      if (vorhandenesWurzelgebiet != null) {
        entity.setUebergeordnetesGebiet(vorhandenesWurzelgebiet);
      }
    }

    super.save(entity);
    // Hack für ELECT-8157
    if (uebergeordnetesGebiet!=null) {
      entity.setUebergeordnetesGebietOhneUpdateBeziehung(dao.attach(uebergeordnetesGebiet));
    }

    rolleEdit.updateRolleArtFuerAlleRollen(entity.getMandant());

    Wahl wahl = entity.getWahl();
    if (wahl != null) {
      wvpWahlkonfigurationAktualisierenEvent.sendWvpWahlkonfigurationAktualisierenEvent(wahl.getPk());
    }
  }

  public void saveFromView(Gebiet entity) {
    save(entity);
  }
}
