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

import de.ivu.elect.business.gebietsbaum.control.StimmbezirkGebietsbaumExchangeContext;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gebietsbaum.entity.GebietTK;
import de.ivu.elect.business.gebietsbaum.entity.Gebietsart;
import de.ivu.elect.business.gebietsbaum.entity.NlGebietsart;
import de.ivu.elect.business.mandant.entity.Mandant;
import org.apache.commons.lang3.StringUtils;

import javax.annotation.Nullable;
import javax.ejb.Stateless;
import javax.enterprise.inject.Specializes;
import javax.inject.Inject;
import java.util.List;
import java.util.Map;

@Stateless
@Specializes
public class NlWasGebietsbaumStimmbezirkImporter extends WasGebietsbaumStimmbezirkImporter {

  @Inject
  private transient GebietsartDAO gebietsartDAO;

  @Inject
  private transient GebietDAO gebietDAO;

  @Nullable
  @Override
  protected Gebiet findeUebergeordnetesGebietInHierarchie(Gebiet uebergeordnetesGebiet, Map<GebietTK, Gebiet> gebieteNachTk, StimmbezirkGebietsbaumExchangeContext context) {
    Gebiet gebiet = super.findeUebergeordnetesGebietInHierarchie(uebergeordnetesGebiet, gebieteNachTk, context);

    if (gebiet == null) {
      if (uebergeordnetesGebiet.getGebietsart() == null || StringUtils.isBlank(uebergeordnetesGebiet.getGebietsart().getName())) {
        try {
          gebiet = findeGebietMitGebietsart(uebergeordnetesGebiet, context, findeGemeinde(context.getMandant()));
        } catch (Exception e) {
          // ignorieren
        }
      }
    }

    if (gebiet == null) {
      gebiet = findeUebergeordnetesGebietInHierarchieWennNummerEindeutig(uebergeordnetesGebiet, context);
    }

    return gebiet;
  }

  private Gebietsart findeGemeinde(Mandant mandant) {
    return gebietsartDAO.findByAll(mandant).stream().filter(NlGebietsart.GEMEENTE::equalsGebietsart).findFirst().orElse(null);
  }

  @Nullable

  private Gebiet findeUebergeordnetesGebietInHierarchieWennNummerEindeutig(Gebiet uebergeordnetesGebiet, StimmbezirkGebietsbaumExchangeContext context) {
    try {
      List<Gebiet> byWahlAndNummer = gebietDAO.findByWahlAndNummer(context.getWahl(), uebergeordnetesGebiet.getNummer());
      if (byWahlAndNummer.size() == 1) {
        return byWahlAndNummer.iterator().next();
      }
    } catch (Exception e) {
      // ignorieren
    }

    return null;
  }
}
