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

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

import de.ivu.elect.business.gebietsbaum.boundary.GebietsgruppierungExtendedDAO;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gebietsbaum.entity.GebietConstants;
import de.ivu.elect.business.gebietsbaum.entity.Gebietsgruppierung;
import de.ivu.elect.business.gebietsbaum.entity.GebietsgruppierungMeta;
import de.ivu.elect.jee.faces.Messages;
import de.ivu.elect.jee.presentation.dynamictable.ColumnType;


import static java.util.Objects.nonNull;

public class GebietsgruppierungGebieteColumn<E extends Gebietsgruppierung> extends AbstractGebietsgruppierungColumn<E> {

  private static final long serialVersionUID = 1L;

  private static final Comparator<Gebiet> DEFAULT_COMPARATOR = Gebiet.GEBIET_BY_GEBIETSART_AND_POSITION_COMPARATOR;
  private static final int MAX_ITEM_COUNT = 10;

  private final GebietsgruppierungExtendedDAO gebietsgruppierungDAO;

  protected GebietsgruppierungGebieteColumn(Messages messages, GebietsgruppierungMeta gebietsgruppierungMeta,
      GebietsgruppierungExtendedDAO gebietsgruppierungDAO) {
    super(messages, GebietConstants.MESSAGE_KEY_ENTITY_MEHRZAHL, ColumnType.COLLECTION, null);
    this.gebietsgruppierungDAO = gebietsgruppierungDAO;
  }

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

    if (nonNull(gebietsgruppierung)) {
      Gebietsgruppierung attached = gebietsgruppierungDAO.attach(gebietsgruppierung);
      List<Gebiet> gebiete = new ArrayList<>(attached.getGebiete());

      Collections.sort(gebiete, DEFAULT_COMPARATOR);

      int count = gebiete.size();
      int skippedCount = count - MAX_ITEM_COUNT;

      for (int i = 0; i < Math.min(count, MAX_ITEM_COUNT); i++) {
        Gebiet gebiet = gebiete.get(i);
        String name = gebiet.getName();

        result.add(name);
      }

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

    return result;
  }

}
