
package de.ivu.elect.presentation.person.action;

import javax.annotation.Nonnull;

import de.ivu.elect.business.gebietsbaum.entity.EntityMitGebiet;
import de.ivu.elect.business.person.entity.Personendaten;
import de.ivu.elect.business.personenpruefung.boundary.AbstractPersonenKonfliktByGebietSearchParameters;
import de.ivu.elect.business.personenpruefung.boundary.AbstractPersonenKonfliktSearchParameters;
import de.ivu.elect.business.personenpruefung.entity.PersonenKonfliktConstants;
import de.ivu.elect.business.personenpruefung.entity.PersonenKonfliktStatus;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.presentation.menu.AbstractActionEntry;
import de.ivu.elect.presentation.security.AbstractGebietSecurity;

public abstract class AbstractPersonendatenPersonenKonfliktSearchAction<P extends Personendaten> extends AbstractActionEntry<P> {

  private static final long serialVersionUID = 1L;

  protected AbstractPersonendatenPersonenKonfliktSearchAction() {
    super();
  }

  @Override
  protected abstract UseCasePermission getRequiredPermission();

  @Override
  public AbstractGebietSecurity getGebietSecurity() {
    return getEinsehenGebietSecurity();
  }

  @Override
  public boolean isDisabledInternal(@Nonnull P personendaten) {
    return !personendaten.isPersonStatusManuellZuPruefenderKonflikt();
  }

  @Override
  public String doIt(P personendaten) {
    AbstractPersonenKonfliktSearchParameters personenKonfliktSearchParameters = getPersonenKonfliktSearchParameters();
    personenKonfliktSearchParameters.reset();

    presetPersonenKonfliktSearchParameters(personendaten);

    return getPersonenKonfliktSearchViewId();
  }

  protected void presetPersonenKonfliktSearchParameters(P personendaten) {
    AbstractPersonenKonfliktSearchParameters personenKonfliktSearchParameters = getPersonenKonfliktSearchParameters();

    personenKonfliktSearchParameters.setFamilienname(personendaten.getFamilienname());
    personenKonfliktSearchParameters.setVorname(personendaten.getRufname());
    personenKonfliktSearchParameters.setPersonenKonfliktStatus(PersonenKonfliktStatus.MANUELL_ZU_PRUEFEN);

    if (personendaten.isInstanceOf(EntityMitGebiet.class) && personenKonfliktSearchParameters instanceof AbstractPersonenKonfliktByGebietSearchParameters) {
      AbstractPersonenKonfliktByGebietSearchParameters personenKonfliktByGebietSearchParameters = (AbstractPersonenKonfliktByGebietSearchParameters) personenKonfliktSearchParameters;

      personenKonfliktByGebietSearchParameters.setGebiet(personendaten.getGebiet());
      personenKonfliktByGebietSearchParameters.setIncludeUntergebiete(true);
    }
  }

  protected abstract AbstractPersonenKonfliktSearchParameters getPersonenKonfliktSearchParameters();

  protected abstract String getPersonenKonfliktSearchViewId();

  @Override
  public boolean isFireChangeEvent() {
    return false;
  }

  @Override
  public void fireChangeEvent() {
    // Do nothing.
  }

  @Override
  public String getLocalizedLabel() {
    return getMessage(getLabelKey(), getMessage(PersonenKonfliktConstants.MESSAGE_KEY_ENTITY_MEHRZAHL));
  }

  @Override
  public String getLabelKey() {
    return "entity.edit.action.go.to.next.view.search";
  }

  @Override
  public String getIcon() {
    return appIcons.getIconSearch();
  }
}
