
package de.ivu.elect.presentation.gruppe.form;

import java.util.Map;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;

import org.primefaces.model.DualListModel;

import de.ivu.elect.jee.faces.FacesMessageUtil;
import de.ivu.elect.jee.presentation.dynamictable.ColumnType;
import de.ivu.elect.presentation.gruppe.table.AbstractGruppeKumulierteStimmenColumn;

public class GruppeNachErfassungsgebietStimmenWerteValidator implements Validator {

  private final Map<String, ColumnType> columnTypePerColumnKey;

  public GruppeNachErfassungsgebietStimmenWerteValidator(Map<String, ColumnType> columnTypePerColumnKey) {
    super();

    this.columnTypePerColumnKey = columnTypePerColumnKey;
  }

  @Override
  public void validate(FacesContext facesContext, UIComponent uiComponent, Object value) throws ValidatorException {
    if (value == null) {
      return;
    }

    DualListModel model = (DualListModel) value;

    boolean isAbsolute = false;
    boolean isRelative = false;

    for (Object columnObject : model.getTarget()) {
      String columnKey = (String) columnObject;

      ColumnType columnType = columnTypePerColumnKey.get(columnKey);

      if (columnType != null) {
        isAbsolute |= AbstractGruppeKumulierteStimmenColumn.STIMMEN_ANZAHL_COLUMN_TYPE.equals(columnType)
            || AbstractGruppeKumulierteStimmenColumn.STIMMEN_ANZAHL_DIFFERENZ_COLUMN_TYPE.equals(columnType);
        isRelative |= AbstractGruppeKumulierteStimmenColumn.STIMMEN_ANTEIL_COLUMN_TYPE.equals(columnType)
            || AbstractGruppeKumulierteStimmenColumn.STIMMEN_ANTEIL_DIFFERENZ_COLUMN_TYPE.equals(columnType);
      }
    }

    if (isRelative && isAbsolute) {
      throw new ValidatorException(FacesMessageUtil.createErrorMessage(facesContext, "gruppe.nach.gebiet.werte.prozent.absolut.vermischt", "gruppe.nach.gebiet.werte.prozent.absolut.vermischt"));
    }
  }
}
