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

import static java.util.Objects.nonNull;
import static org.apache.commons.lang3.StringUtils.isBlank;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import de.ivu.elect.business.staat.boundary.StaatenGruppeExtendedDAO;
import de.ivu.elect.business.staat.control.StaatByNameStaatsangehoerigkeitInlandZuerstComparator;
import de.ivu.elect.business.staat.entity.Staat;
import de.ivu.elect.business.staat.entity.StaatConstants;
import de.ivu.elect.business.staat.entity.StaatenGruppe;
import de.ivu.elect.business.staat.entity.StaatenGruppeMeta;
import de.ivu.elect.jee.faces.Messages;
import de.ivu.elect.jee.presentation.dynamictable.ColumnType;

public class StaatenGruppeStaatenColumn<E extends StaatenGruppe> extends AbstractStaatenGruppeColumn<E> {

  private static final long serialVersionUID = 1L;

  private static final int MAX_ITEM_COUNT = 10;

  private static final Comparator<Staat> DEFAULT_COMPARATOR = new StaatByNameStaatsangehoerigkeitInlandZuerstComparator();

  private final StaatenGruppeExtendedDAO staatenGruppeDao;

  protected StaatenGruppeStaatenColumn(Messages messages, StaatenGruppeMeta staatenGruppeMeta, StaatenGruppeExtendedDAO staatenGruppeDao) {
    super(messages, null, null, null);

    this.staatenGruppeDao = staatenGruppeDao;
  }

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

  @Override
  public Object getValue(E staatenGruppe) {
    List<String> result = new ArrayList<>();

    if (nonNull(staatenGruppe)) {
      StaatenGruppe attached = staatenGruppeDao.attach(staatenGruppe);
      List<Staat> staaten = new ArrayList<>(attached.getStaats());

      Collections.sort(staaten, DEFAULT_COMPARATOR);

      int staatenCount = staaten.size();
      int staatenSkippedCount = staatenCount - MAX_ITEM_COUNT;

      for (int i = 0; i < Math.min(staatenCount, MAX_ITEM_COUNT); i++) {
        Staat staat = staaten.get(i);
        String name = staat.getNameStaat();

        if (isBlank(name)) {
          name = staat.getNameStaatsangehoerigkeit();
        }

        result.add(name);
      }

      if (staatenSkippedCount > 0) {
        result.add(getMessage("column.value.items.count.skipped", staatenSkippedCount));
      }
    }

    return result;
  }

  @Override
  public String getHeader() {
    return getMessage(StaatConstants.MESSAGE_KEY_ENTITY_MEHRZAHL);
  }
}
