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

import java.util.Collection;
import java.util.HashSet;

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 wohnungsgeberAnzeigen;

  private boolean staatAnzeigen;

  private final String id;

  protected AbstractZusammengesetzteAnschriftColumn(String id, Messages messages, ZusammengesetzteAnschriftFormatter zusammengesetzteAnschriftFormatter) {
    super(messages);

    this.id = id;

    this.wohnungsgeberAnzeigen = true;
    this.staatAnzeigen = false;

    this.zusammengesetzteAnschriftFormatter = zusammengesetzteAnschriftFormatter;
  }

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

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

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

  protected String getHeaderKey() {
    return ZUSAMMENGESETZTE_ANSCHRIFT_COLUMN_HEADER;
  }

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

    Collection<String> attributesIgnored = new HashSet<>();

    if (!wohnungsgeberAnzeigen) {
      attributesIgnored.add(ZusammengesetzteAnschriftFormatter.ATTRIBUTE_WOHNUNGSGEBER);
    }

    if (!staatAnzeigen) {
      attributesIgnored.add(ZusammengesetzteAnschriftFormatter.ATTRIBUTE_STAAT);
    }

    return zusammengesetzteAnschriftFormatter.formatOhne(zusammengesetzteAnschrift, attributesIgnored);
  }

  protected abstract ZusammengesetzteAnschrift getAnschrift(E entity);

  public void setWohnungsgeberAnzeigen() {
    this.wohnungsgeberAnzeigen = true;
  }

  public void setWohnungsgeberNichtAnzeigen() {
    this.wohnungsgeberAnzeigen = false;
  }

  public void setStaatAnzeigen() {
    this.staatAnzeigen = true;
  }

  public void setStaatNichtAnzeigen() {
    this.staatAnzeigen = false;
  }
}
