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

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

import de.ivu.elect.business.benutzerverwaltung.entity.Nachricht;
import de.ivu.elect.business.benutzerverwaltung.entity.NachrichtMeta;
import de.ivu.elect.business.benutzerverwaltung.entity.Rolle;
import de.ivu.elect.business.benutzerverwaltung.entity.RolleByNameComparator;
import de.ivu.elect.business.benutzerverwaltung.entity.RolleConstants;
import de.ivu.elect.jee.faces.Messages;
import de.ivu.elect.jee.presentation.dynamictable.ColumnType;

public class NachrichtEmpfaengerRolleColumn<E extends Nachricht> extends AbstractNachrichtColumn<E> {

  private static final long serialVersionUID = 1L;

  private static final Comparator<Rolle> DEFAULT_COMPARATOR = new RolleByNameComparator();

  private static final int MAX_ITEM_COUNT = 5;

  public NachrichtEmpfaengerRolleColumn(Messages messages, NachrichtMeta nachrichtMeta) {
    super(NachrichtEmpfaengerRolleColumn.class.getName(), messages,RolleConstants.MESSAGE_KEY_ENTITY_MEHRZAHL, ColumnType.COLLECTION, null);
  }

  @Override
  public Object getValue(E nachricht) {
    return getValueInternal(nachricht);
  }

  private Object getValueInternal(Nachricht nachricht) {
    if (nachricht == null || nachricht.isEmpfaengerAlle()) {
      return Collections.emptyList(); // WASDE-1714
    }

    if (nachricht.hasUrspruenglicheNachricht()) {
      return getValueInternal(nachricht.getUrspruenglicheNachricht());
    }

    return formatEmpfaenger(nachricht);
  }

  private List<String> formatEmpfaenger(Nachricht nachricht) {
    List<String> result;

    List<Rolle> empfaengerRollen = new ArrayList<>(nachricht.getEmpfaengerRollen());
    empfaengerRollen.sort(DEFAULT_COMPARATOR);

    int empfaengerRollenCount = empfaengerRollen.size();
    int empfaengerRollenSkippedCount = empfaengerRollenCount - MAX_ITEM_COUNT;

    result = IntStream.range(0, Math.min(empfaengerRollenCount, MAX_ITEM_COUNT)).mapToObj(i -> empfaengerRollen.get(i).getName()).collect(Collectors.toList());

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

    return result;
  }
}
