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

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

import de.ivu.elect.business.gruppe.boundary.GruppeEdit;
import de.ivu.elect.business.gruppe.entity.Gruppe;
import de.ivu.elect.business.gruppeimgebiet.control.GruppeImGebietUniquePositionValidator;
import de.ivu.elect.business.gruppeimgebiet.entity.GruppeImGebiet;

@Stateless
public class ReferendumVorlageImGebietEdit extends AbstractGruppeImGebietEdit {

  @Inject
  private GruppeEdit gruppeEdit;

  @Inject
  private transient GruppeImGebietHierarchyBuilder gruppeImGebietHierarchyBuilder;

  @Inject
  private GruppeImGebietUniquePositionValidator gruppeImGebietUniquePositionValidator;

  @Override
  protected boolean usesMixedTransactionalContexts() {
    // ELECT-945, bspw. GruppeImGebietUniquePositionValidator!
    return true;
  }

  @Override
  public void save(GruppeImGebiet referendumVorlageImGebiet) {
    assertUniqueGruppeImGebietPosition(referendumVorlageImGebiet);

    // ELECT-13205
    if (referendumVorlageImGebiet.getRelativePosition() != null) {
      referendumVorlageImGebiet.getGruppe().setRelativePosition(referendumVorlageImGebiet.getRelativePosition());
    }

    super.save(referendumVorlageImGebiet);

    gruppeImGebietHierarchyBuilder.updatePositionenInHierachie(referendumVorlageImGebiet);
  }

  @Override
  public void delete(GruppeImGebiet referendumVorlageImGebiet) {
    delete(referendumVorlageImGebiet.getGruppe(), referendumVorlageImGebiet);
  }

  private void delete(Gruppe referendumVorlage, GruppeImGebiet referendumVorlageImGebiet) {
    super.delete(referendumVorlageImGebiet);

    delete(referendumVorlage);
  }

  private void delete(Gruppe gruppe) {
    gruppeEdit.delete(gruppe);
  }

  private void assertUniqueGruppeImGebietPosition(GruppeImGebiet gruppeImGebiet) {
    if (!gruppeImGebietUniquePositionValidator.isValid(gruppeImGebiet)) {
      throw new IllegalArgumentException(
          "Position der GruppeImGebiet einer Vorlage eines Referendums muss eineindetig sein [wahl = "
              + gruppeImGebiet.getWahl() + ", gruppeImGebiet = " + gruppeImGebiet + ", position = "
              + gruppeImGebiet.getRelativePosition() + "]");
    }
  }
}
