
package de.ivu.elect.presentation.anschrift.table;

import de.ivu.elect.business.anschrift.boundary.ZusammengesetzteAnschriftFormatter;
import de.ivu.elect.jee.faces.Messages;
import de.ivu.elect.jee.presentation.dynamictable.ColumnType;
import de.ivu.elect.presentation.table.AbstractColumnEntry;

public abstract class AbstractZusammengesetzteAnschriftColumn<E> extends AbstractColumnEntry<E> {

  private static final long serialVersionUID = 1L;

  public static final String ZUSAMMENGESETZTE_ANSCHRIFT_COLUMN_HEADER = "zusammengesetzte.anschrift.column.header";
  public static final String ZUSAMMENGESETZTE_ANSCHRIFT_KURZ_COLUMN_HEADER = "zusammengesetzte.anschrift.kurz.column.header";

  private final ZusammengesetzteAnschriftFormatter zusammengesetzteAnschriftFormatter;

  private boolean attributStaatAnzeigen;

  private final String id;

  public AbstractZusammengesetzteAnschriftColumn(String id, Messages messages, ZusammengesetzteAnschriftFormatter zusammengesetzteAnschriftFormatter) {
    super(messages);
    this.id = id;

    this.zusammengesetzteAnschriftFormatter = zusammengesetzteAnschriftFormatter;
  }

  @Override
  public Object getValue(E entity) {
    ZusammengesetzteAnschrift zusammengesetzteAnschrift = getAnschrift(entity);

    if (isAttributStaatAnzeigen()) {
      return zusammengesetzteAnschriftFormatter.formatVollstaendig(zusammengesetzteAnschrift);
    }

    return zusammengesetzteAnschriftFormatter.formatOhneStaat(zusammengesetzteAnschrift);
  }

  protected abstract ZusammengesetzteAnschrift getAnschrift(E entity);

  public boolean isAttributStaatAnzeigen() {
    return attributStaatAnzeigen;
  }

  public void setAttributStaatAnzeigen(boolean attributStaatAnzeigen) {
    this.attributStaatAnzeigen = attributStaatAnzeigen;
  }

  @Override
  public String getHeader() {
    return getMessage(getHeaderKey());
  }

  protected String getHeaderKey() {
    return ZUSAMMENGESETZTE_ANSCHRIFT_COLUMN_HEADER;
  }

  @Override
  public ColumnType getType() {
    return ColumnType.STRING;
  }

  @Override
  public String getName() {
    return id;
  }

}
