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

import static org.apache.commons.lang3.StringUtils.isNotBlank;

import de.ivu.elect.business.anschrift.entity.Anschrift;
import de.ivu.elect.business.anschrift.entity.AnschriftConstants;
import de.ivu.elect.business.person.entity.Geschlecht;
import de.ivu.elect.business.person.entity.Personendaten;
import de.ivu.elect.business.person.entity.PersonendatenConstants;
import de.ivu.elect.business.staat.entity.StaatConstants;
import de.ivu.elect.jee.faces.Messages;

public enum WahlrechtPflichtangabe {

  FAMILIENNAME {

    @Override
    public boolean isPersonendaten() {
      return true;
    }

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

    @Override
    protected boolean isVorhandenInternal(Personendaten personendaten) {
      return isNotBlank(personendaten.getFamilienname());
    }

    @Override
    protected boolean isGeaendertInternal(Personendaten personendaten) {
      return personendaten.hasChangedFamilienname();
    }

    @Override
    public String getLabelMsgKey() {
      return PersonendatenConstants.MESSAGE_KEY_FAMILIENNAME_EINZAHL;
    }
  },
  RUFNAME {

    @Override
    public boolean isPersonendaten() {
      return true;
    }

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

    @Override
    protected boolean isVorhandenInternal(Personendaten personendaten) {
      return isNotBlank(personendaten.getRufname());
    }

    @Override
    protected boolean isGeaendertInternal(Personendaten personendaten) {
      return personendaten.hasChangedRufname();
    }

    @Override
    public String getLabelMsgKey() {
      return PersonendatenConstants.MESSAGE_KEY_VORNAME_EINZAHL;
    }
  },
  VORNAMEN {

    @Override
    public boolean isPersonendaten() {
      return true;
    }

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

    @Override
    protected boolean isVorhandenInternal(Personendaten personendaten) {
      return isNotBlank(personendaten.getVornamen());
    }

    @Override
    protected boolean isGeaendertInternal(Personendaten personendaten) {
      return personendaten.hasChangedVornamen();
    }

    @Override
    public String getLabelMsgKey() {
      return PersonendatenConstants.MESSAGE_KEY_VORNAMEN_VOLLSTAENDIG_EINZAHL;
    }
  },

  GESCHLECHT {

    @Override
    public boolean isPersonendaten() {
      return true;
    }

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

    @Override
    protected boolean isVorhandenInternal(Personendaten personendaten) {
      Geschlecht value = personendaten.getGeschlecht();

      return value != null && !value.isUnbekannt();
    }

    @Override
    protected boolean isGeaendertInternal(Personendaten personendaten) {
      return personendaten.hasChangedGeschlecht();
    }

    @Override
    public String getLabelMsgKey() {
      return PersonendatenConstants.MESSAGE_KEY_GESCHLECHT_EINZAHL;
    }
  },

  GEBURTSDATUM {

    @Override
    public boolean isPersonendaten() {
      return true;
    }

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

    @Override
    protected boolean isVorhandenInternal(Personendaten personendaten) {
      return personendaten.getGeburtsdatum() != null;
    }

    @Override
    protected boolean isGeaendertInternal(Personendaten personendaten) {
      return personendaten.hasChangedGeburtsdatum();
    }

    @Override
    public String getLabelMsgKey() {
      return PersonendatenConstants.MESSAGE_KEY_GEBURTSDATUM_EINZAHL;
    }
  },
  GEBURTSORT {

    @Override
    public boolean isPersonendaten() {
      return true;
    }

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

    @Override
    protected boolean isVorhandenInternal(Personendaten personendaten) {
      return isNotBlank(personendaten.getGeburtsort());
    }

    @Override
    protected boolean isGeaendertInternal(Personendaten personendaten) {
      return personendaten.hasChangedGeburtsort();
    }

    @Override
    public String getLabelMsgKey() {
      return PersonendatenConstants.MESSAGE_KEY_GEBURTSORT_EINZAHL;
    }
  },

  BERUF {

    @Override
    public boolean isPersonendaten() {
      return true;
    }

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

    @Override
    protected boolean isVorhandenInternal(Personendaten personendaten) {
      return !personendaten.getBerufAsList().isEmpty();
    }

    @Override
    protected boolean isGeaendertInternal(Personendaten personendaten) {
      return personendaten.hasChangedBerufUnformatiert();
    }

    @Override
    public String getLabelMsgKey() {
      return PersonendatenConstants.MESSAGE_KEY_BERUF_EINZAHL;
    }
  },

  STAATSANGEHOERIGKEIT {

    @Override
    public boolean isPersonendaten() {
      return true;
    }

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

    @Override
    protected boolean isVorhandenInternal(Personendaten personendaten) {
      return personendaten.hasStaatsangehoerigkeit();
    }

    @Override
    protected boolean isGeaendertInternal(Personendaten personendaten) {
      return personendaten.hasChangedStaatsangehoerigkeiten();
    }

    @Override
    public String getLabelMsgKey() {
      return StaatConstants.MESSAGE_KEY_NAME_STAATSANGEHOERIGKEIT_EINZAHL;
    }
  },

  ANSCHRIFT_STRASSE {

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

    @Override
    public boolean isAnschrift() {
      return true;
    }

    @Override
    protected boolean isVorhandenInternal(Personendaten personendaten) {
      Anschrift anschrift = personendaten.getAnschrift();

      return anschrift != null && isNotBlank(anschrift.getStrasse());
    }

    @Override
    protected boolean isGeaendertInternal(Personendaten personendaten) {
      Anschrift anschrift = personendaten.getAnschrift();

      return anschrift != null && anschrift.hasChangedStrasse();
    }

    @Override
    public String getLabelMsgKey() {
      return AnschriftConstants.MESSAGE_KEY_STRASSE_EINZAHL;
    }
  },
  ANSCHRIFT_HAUSNUMMER {

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

    @Override
    public boolean isAnschrift() {
      return true;
    }

    @Override
    protected boolean isVorhandenInternal(Personendaten personendaten) {
      Anschrift anschrift = personendaten.getAnschrift();

      return anschrift != null && isNotBlank(anschrift.getHausnummer());
    }

    @Override
    protected boolean isGeaendertInternal(Personendaten personendaten) {
      Anschrift anschrift = personendaten.getAnschrift();

      return anschrift != null && anschrift.hasChangedHausnummer();
    }

    @Override
    public String getLabelMsgKey() {
      return AnschriftConstants.MESSAGE_KEY_HAUSNUMMER_EINZAHL;
    }
  },
  ANSCHRIFT_PLZ {

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

    @Override
    public boolean isAnschrift() {
      return true;
    }

    @Override
    protected boolean isVorhandenInternal(Personendaten personendaten) {
      Anschrift anschrift = personendaten.getAnschrift();

      return anschrift != null && isNotBlank(anschrift.getPlz());
    }

    @Override
    protected boolean isGeaendertInternal(Personendaten personendaten) {
      Anschrift anschrift = personendaten.getAnschrift();

      return anschrift != null && anschrift.hasChangedPlz();
    }

    @Override
    public String getLabelMsgKey() {
      return AnschriftConstants.MESSAGE_KEY_PLZ_EINZAHL;
    }
  },
  ANSCHRIFT_ORT {

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

    @Override
    public boolean isAnschrift() {
      return true;
    }

    @Override
    protected boolean isVorhandenInternal(Personendaten personendaten) {
      Anschrift anschrift = personendaten.getAnschrift();

      return anschrift != null && isNotBlank(anschrift.getOrt());
    }

    @Override
    protected boolean isGeaendertInternal(Personendaten personendaten) {
      Anschrift anschrift = personendaten.getAnschrift();

      return anschrift != null && anschrift.hasChangedOrt();
    }

    @Override
    public String getLabelMsgKey() {
      return AnschriftConstants.MESSAGE_KEY_ORT_EINZAHL;
    }
  },
  ANSCHRIFT_ORTSTEIL {

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

    @Override
    public boolean isAnschrift() {
      return true;
    }

    @Override
    protected boolean isVorhandenInternal(Personendaten personendaten) {
      Anschrift anschrift = personendaten.getAnschrift();

      return anschrift != null && isNotBlank(anschrift.getOrtsteil());
    }

    @Override
    protected boolean isGeaendertInternal(Personendaten personendaten) {
      Anschrift anschrift = personendaten.getAnschrift();

      return anschrift != null && anschrift.hasChangedOrtsteil();
    }

    @Override
    public String getLabelMsgKey() {
      return AnschriftConstants.MESSAGE_KEY_ORTSTEIL_EINZAHL;
    }
  },

  ;

  WahlrechtPflichtangabe() {
  }

  public abstract boolean isPersonendaten();

  public abstract boolean isAnschrift();

  public boolean isVorhanden(Personendaten personendaten) {
    return personendaten != null && isVorhandenInternal(personendaten);
  }

  protected abstract boolean isVorhandenInternal(Personendaten personendaten);

  public boolean isGeaendert(Personendaten personendaten) {
    return personendaten != null && isGeaendertInternal(personendaten);
  }

  protected abstract boolean isGeaendertInternal(Personendaten personendaten);

  public String getLabel(Messages messages) {
    return messages.getMessageForMessageKey(getLabelMsgKey());
  }

  public abstract String getLabelMsgKey();
}
