package de.ivu.elect.business.stimmeingabe.boundary;

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

import javax.ejb.Stateless;
import javax.inject.Inject;

import de.ivu.elect.business.exchange.control.AbstractExporter;
import de.ivu.elect.business.exchange.control.ExportExchange;
import de.ivu.elect.business.exchange.entity.DateiExportArt;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.stimmeingabe.control.StimmeingabeExportContext;
import de.ivu.elect.business.stimmeingabe.control.StimmeingabeExportExchange;
import de.ivu.elect.business.stimmeingabe.entity.Ergebniseingang;
import de.ivu.elect.business.stimmeingabe.entity.Ergebniseingangsart;
import de.ivu.elect.business.wahl.boundary.WahldurchfuehrungDAO;

@Stateless
public class StimmeingabeExporter extends AbstractExporter<List<Ergebniseingang>, StimmeingabeExportContext> {

  @Inject
  private transient StimmeingabeExportExchange exportExchange;

  @Inject
  private transient WahldurchfuehrungDAO wahldurchfuehrungDAO;

  @Inject
  private transient ErgebniseingangDAO ergebniseingangDAO;

  @Override
  protected ExportExchange<List<Ergebniseingang>, StimmeingabeExportContext> getExchange() {
    return exportExchange;
  }

  @Override
  protected List<Ergebniseingang> getExportObject(StimmeingabeExportContext stimmeingabeExportContext) {
    return filtereJeweilsLetztenEingangProGebiet(stimmeingabeExportContext, ergebniseingangDAO.findByWahl(wahldurchfuehrungDAO.attach(stimmeingabeExportContext.getWahldurchfuehrung())));
  }

  // ELECTMUC-405
  private List<Ergebniseingang> filtereJeweilsLetztenEingangProGebiet(StimmeingabeExportContext stimmeingabeExportContext, List<Ergebniseingang> ergebniseingaenge) {
    if (stimmeingabeExportContext.isNurJeweilsLetztenEingangProGebiet()) {
      Map<Ergebniseingangsart, Map<Gebiet, Ergebniseingang>> letzterEingangProErgebniseingangsartUndGebiet = new HashMap<>();

      for (Ergebniseingang ergebniseingang : ergebniseingaenge) {
        Ergebniseingangsart ergebniseingangsart = ergebniseingang.getErgebniseingangsart();
        Map<Gebiet, Ergebniseingang> letzterEingangProGebiet = letzterEingangProErgebniseingangsartUndGebiet.get(ergebniseingangsart);
        if (letzterEingangProGebiet == null) {
          letzterEingangProGebiet = new HashMap<>();
          letzterEingangProErgebniseingangsartUndGebiet.put(ergebniseingangsart, letzterEingangProGebiet);
        }

        Gebiet gebiet = ergebniseingang.getWahldurchfuehrungsgebiet();
        if (letzterEingangProGebiet.containsKey(gebiet)) {
          Ergebniseingang anderer = letzterEingangProGebiet.get(gebiet);
          if (anderer.isVorEingangEingegeben(ergebniseingang)) {
            letzterEingangProGebiet.put(gebiet, ergebniseingang);
          }
        } else {
          letzterEingangProGebiet.put(gebiet, ergebniseingang);
        }
      }
      List<Ergebniseingang> result = new ArrayList<>(ergebniseingaenge.size());
      for (Map<Gebiet, Ergebniseingang> letzterEingangProGebiet : letzterEingangProErgebniseingangsartUndGebiet.values()) {
        result.addAll(letzterEingangProGebiet.values());
      }

      return result;
    }

    return ergebniseingaenge;
  }

  @Override
  protected DateiExportArt getDateiExportArt() {
    return DateiExportArt.STIMMEINGABE_EXPORT;
  }
}
