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

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;

import de.ivu.elect.business.gebietsbaum.control.GebietByBreadthFirstComparator;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.wahlvorschlag.boundary.AbstractListeDAO;
import de.ivu.elect.business.wahlvorschlag.entity.Liste;
import de.ivu.elect.business.wahlvorschlag.entity.NlListeStatus;
import de.ivu.elect.business.wahlvorschlag.entity.WahlvorschlagPK;
import de.ivu.elect.jee.faces.Messages;
import de.ivu.elect.jee.presentation.dynamictable.ColumnType;
import de.ivu.elect.presentation.gebietsbaum.GebietNummerFormatter;
import de.ivu.elect.presentation.gruppe.table.NlGruppeWahlkreiseColumn;
import de.ivu.elect.presentation.wahlvorschlag.NlListeStelInformationCache;

public class NlListeWahlkreiseColumn extends AbstractWahlvorschlagColumn<Liste> {

  private static final long serialVersionUID = 1L;

  protected NlListeWahlkreiseColumn(Messages messages, AbstractListeDAO listeDAO, GebietNummerFormatter gebietNummerFormatter, NlListeStelInformationCache nlListeStelInformationCache) {
    super("NlListeWahlkreiseColumn", messages, "gruppe.colum.wahlkreis", ColumnType.STRING,
        liste -> {
          Map<Gebiet, Liste> listenNachGebiet = new HashMap<>();
          for (WahlvorschlagPK wahlvorschlagPK : nlListeStelInformationCache.getStelInformationen(liste).getListenDesStels()) {
            Liste byPrimaryKey = listeDAO.findByPrimaryKey(wahlvorschlagPK);
            Gebiet gebiet = byPrimaryKey.getGebiet();
            listenNachGebiet.put(gebiet, byPrimaryKey);
          }

          ArrayList<String> result = new ArrayList<>();

          listenNachGebiet.entrySet().stream().sorted((u, v) -> GebietByBreadthFirstComparator.INSTANCE.compare(u.getKey(), v.getKey())).forEach(
              e -> {
                Gebiet gebiet = e.getKey();
                Liste listeImGebiet = e.getValue();
                NlListeStatus nlListeStatus = nlListeStelInformationCache.getNlListeStatus(listeImGebiet);
                String text = messages.getMessageForMessageKey(nlListeStatus.getIconMsgKey()) + " " + gebietNummerFormatter.getDarstellung(gebiet);
                result.add(NlGruppeWahlkreiseColumn.COMPILE.matcher(text).replaceAll(Matcher.quoteReplacement("\u00A0")));
              }
          );

          return String.join(", ", result);
        }
    );
  }
}
