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

import static java.util.Collections.singleton;

import java.util.Collection;

import javax.annotation.Nullable;
import javax.inject.Inject;

import de.ivu.elect.business.personenpruefung.entity.PersonPruefungKonfiguration;
import de.ivu.elect.business.personenpruefung.entity.PersonPruefungKonfigurationPersonentyp;
import de.ivu.elect.business.personenpruefung.entity.PersonPruefungKonfigurationStatus;
import de.ivu.elect.business.personenpruefung.entity.PersonPruefungKonfigurationTyp;
import de.ivu.elect.business.wahl.boundary.WahlartTemplate;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.Wahltermin;
import de.ivu.elect.jee.cdi.BeanManagerUtil;
import de.ivu.elect.jee.entity.customdata.CustomData;
import de.ivu.elect.jee.faces.Messages;

public abstract class AbstractPersonPruefungKonfigurationDefault implements PersonPruefungKonfigurationDefault {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient Messages messages;

  protected AbstractPersonPruefungKonfigurationDefault() {
    super();
  }

  @Override
  public Collection<PersonPruefungKonfiguration> getPersonPruefungKonfigurationenDefault(Wahltermin wahltermin, @Nullable Wahl wahl) {
    PersonPruefungKonfiguration personPruefungKonfiguration = new PersonPruefungKonfiguration(createCustomData(wahltermin, wahl));
    personPruefungKonfiguration.setWahltermin(wahltermin);
    personPruefungKonfiguration.setWahl(wahl);
    personPruefungKonfiguration.setTyp(getTyp());
    personPruefungKonfiguration.setPersonentyp(getPersonentyp());
    personPruefungKonfiguration.setName(getName());
    personPruefungKonfiguration.setBeschreibung(getBeschreibung());
    personPruefungKonfiguration.setStatus(getStatus());

    return singleton(personPruefungKonfiguration);
  }

  protected abstract PersonPruefungKonfigurationTyp getTyp();

  protected abstract PersonPruefungKonfigurationPersonentyp getPersonentyp();

  protected abstract String getName();

  protected abstract String getBeschreibung();

  protected abstract CustomData createCustomData(Wahltermin wahltermin, @Nullable Wahl wahl);

  protected PersonPruefungKonfigurationStatus getStatus() {
    return PersonPruefungKonfigurationStatus.AKTIVIERT_DEFAULT;
  }

  protected String getMessage(Enum< ? > enumValue) {
    return getMessages().lokalisiere(enumValue);
  }

  protected String getMessage(String msgKey, Object... params) {
    return getMessages().getMessageForMessageKey(msgKey, params);
  }

  protected Messages getMessages() {
    if (messages == null) {
      messages = BeanManagerUtil.getBeanByClass(Messages.class);
    }

    return messages;
  }

  protected boolean containsWahlart(Collection<WahlartTemplate> wahlarten, Wahl wahl) {
    for (WahlartTemplate wahlart : wahlarten) {
      if (wahlart.equalsWahlart(wahl)) {
        return true;
      }
    }

    return false;
  }
}
