package de.ivu.elect.wus.exchange.wahlvorschlag;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.enterprise.inject.Specializes;

import de.ivu.elect.business.gruppe.entity.NlGruppeCustomData;
import de.ivu.elect.business.gruppe.entity.NlPolitischeGruppeArt;
import de.ivu.elect.business.gruppe.entity.PolitischeGruppe;
import de.ivu.elect.business.wahlvorschlag.entity.Liste;
import de.ivu.elect.nl.eml.readable.AffiliationWrapper;
import de.ivu.elect.nl.eml.readable.ListSubmissionMode;

@Specializes
public class WasEml230Mapper extends Eml230Mapper {
  private static final long serialVersionUID = 1L;

  @Override
  protected void mappeEinreichungsart(AffiliationWrapper affiliationWrapper, Liste liste) {
    super.mappeEinreichungsart(affiliationWrapper, liste);
    NlPolitischeGruppeArt nlPolitischeGruppeArt = mappe(affiliationWrapper.getListSubMissionMode());
    if (!nlPolitischeGruppeArt.isUnbekannt()) {
      liste.getGruppe().getCustomData(NlGruppeCustomData.class)
          .setNlPolitischeGruppeArt(nlPolitischeGruppeArt); // Im WAS verändert sich nichts mehr => cachen
    }
  }

  @Override
  protected void korrigiereEinreichungsart(Map<PolitischeGruppe, Map<Integer, List<Liste>>> listenNachPolitischerGruppeUndStelNummer) {
    super.korrigiereEinreichungsart(listenNachPolitischerGruppeUndStelNummer);

    Map<PolitischeGruppe, List<Liste>> listenNachPolitischerGruppe = bestimmeListenNachPolitischerGruppe(listenNachPolitischerGruppeUndStelNummer);

    // ELECT-10456 Gruppen mit einer Liste sind immer Einzellisten, egal was im EML stand
    for (Map.Entry<PolitischeGruppe, List<Liste>> entry : listenNachPolitischerGruppe.entrySet()) {
      if (entry.getValue().size()==1) {
        entry.getKey().getCustomData(NlGruppeCustomData.class)
            .setNlPolitischeGruppeArt(NlPolitischeGruppeArt.EINZELLISTE);
      }
    }
  }

  private Map<PolitischeGruppe, List<Liste>> bestimmeListenNachPolitischerGruppe(Map<PolitischeGruppe, Map<Integer, List<Liste>>> listenNachPolitischerGruppeUndStelNummer) {
    Map<PolitischeGruppe, List<Liste>> result = new HashMap<>();
    for (Map.Entry<PolitischeGruppe, Map<Integer, List<Liste>>> entry : listenNachPolitischerGruppeUndStelNummer.entrySet()) {
      ArrayList<Liste> listen = new ArrayList<>();

      for (List<Liste> value : entry.getValue().values()) {
        listen.addAll(value);
      }
      result.put(entry.getKey(), listen);
    }

    return result;
  }

  NlPolitischeGruppeArt mappe(ListSubmissionMode listSubMissionMode) {
    if (listSubMissionMode == null) {
      return NlPolitischeGruppeArt.UNBEKANNT;
    }
    switch (listSubMissionMode) {
      case SET_OF_LISTS:
        return NlPolitischeGruppeArt.IDENTISCHE_LISTE;
      case SINGLELIST:
        return NlPolitischeGruppeArt.EINZELLISTE;
      case LISTGROUP:
        return NlPolitischeGruppeArt.LISTENGRUPPE;
      case UNKNOWN:
        return NlPolitischeGruppeArt.UNBEKANNT;
    }

    throw new IllegalArgumentException("Unbakannter ListSubmissionMode:" + listSubMissionMode);
  }

}
