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

import de.ivu.elect.business.personenpruefung.control.PersonPruefungKonfigurationDefault;
import de.ivu.elect.business.personenpruefung.control.PersonPruefungKonfigurationInit;
import de.ivu.elect.business.personenpruefung.entity.PersonPruefungKonfiguration;
import de.ivu.elect.business.personenpruefung.entity.PersonPruefungKonfigurationCustomData;
import de.ivu.elect.business.personenpruefung.entity.PersonPruefungKonfigurationStatus;
import de.ivu.elect.jee.entity.customdata.EmptyCustomData;

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

@Stateless
public class PersonPruefungKonfigurationEdit extends AbstractPersonPruefungKonfigurationEdit {

  @Inject
  private transient PersonPruefungKonfigurationInit personPruefungKonfigurationInit;

  @Inject
  private transient Instance<PersonPruefungKonfigurationDefault> personPruefungKonfigurationDefaults;

  @Override
  public void save(PersonPruefungKonfiguration personPruefungKonfiguration) {
    if (personPruefungKonfiguration.getStatus().isAktiv()) {
      if (isCustomDataDefaultOverridden(personPruefungKonfiguration)) {
        personPruefungKonfiguration.setStatus(PersonPruefungKonfigurationStatus.AKTIVIERT_CUSTOM);
      } else {
        personPruefungKonfiguration.setStatus(PersonPruefungKonfigurationStatus.AKTIVIERT_DEFAULT);
      }
    }
    super.save(personPruefungKonfiguration);
  }

  private boolean isCustomDataDefaultOverridden(PersonPruefungKonfiguration personPruefungKonfiguration) {
    PersonPruefungKonfiguration konfigurationDefault = personPruefungKonfiguration.ermittleDefault(personPruefungKonfigurationDefaults);
    if (!(personPruefungKonfiguration.getCustomData() instanceof EmptyCustomData) && konfigurationDefault != null) {
      PersonPruefungKonfigurationCustomData customDataDefault = konfigurationDefault.getCustomData(PersonPruefungKonfigurationCustomData.class);
      return personPruefungKonfiguration.getCustomData(PersonPruefungKonfigurationCustomData.class).isCustomDataDefaultOverridden(customDataDefault);
    }
    return false;
  }

  public void aktiviere(PersonPruefungKonfiguration personPruefungKonfigurationNotAttached) {
    PersonPruefungKonfiguration personPruefungKonfigurationAttached = getAttachedEntity(personPruefungKonfigurationNotAttached);
    if (isCustomDataDefaultOverridden(personPruefungKonfigurationAttached)) {
      personPruefungKonfigurationAttached.setStatus(PersonPruefungKonfigurationStatus.AKTIVIERT_CUSTOM);
    } else {
      personPruefungKonfigurationAttached.setStatus(PersonPruefungKonfigurationStatus.AKTIVIERT_DEFAULT);
    }
  }

  public void deaktiviere(PersonPruefungKonfiguration personPruefungKonfigurationNotAttached) {
    PersonPruefungKonfiguration personPruefungKonfigurationAttached = getAttachedEntity(personPruefungKonfigurationNotAttached);
    personPruefungKonfigurationAttached.setStatus(PersonPruefungKonfigurationStatus.DEAKTIVIERT);
  }

  public void resetToDefault(PersonPruefungKonfiguration personPruefungKonfiguration) {
    PersonPruefungKonfiguration konfigurationDefault = personPruefungKonfiguration.ermittleDefault(personPruefungKonfigurationDefaults);
    if (konfigurationDefault != null) {
      personPruefungKonfigurationInit.update(konfigurationDefault, personPruefungKonfiguration);
      save(personPruefungKonfiguration);
    } else {
      throw new RuntimeException("Keinen Default für PersonPruefungKonfiguration gefunden: " + personPruefungKonfiguration);
    }
  }
}
