
package de.ivu.elect.business.wahl.control;

import static org.apache.commons.lang3.StringUtils.isNotBlank;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Optional;
import java.util.function.Function;

import javax.inject.Inject;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.wahl.entity.NlWahlCreateData;
import de.ivu.elect.business.wahl.entity.NlWahlart;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.WahlParameter;
import de.ivu.elect.business.wahl.entity.WahlParameterWerte;
import de.ivu.elect.jee.faces.Messages;

// ELECT-13993, ELECT-14208
public class NlWahlParameterPostCreate {

  private static final Logger LOG = LoggerFactory.getLogger(NlWahlParameterPostCreate.class);

  @Inject
  private transient Messages messages;

  public NlWahlParameterPostCreate() {
    super();
  }

  NlWahlParameterPostCreate(Messages messages) {
    super();

    this.messages = messages;
  }

  public Collection<WahlParameter> overrideDokumentPlatzhalter(Wahl wahl, Gebiet wurzelgebiet, Function<WahlParameterWerte, WahlParameter> wahlParameterFct) {
    List<WahlParameter> result = new ArrayList<>();

    overrideDokumentPlatzhalterWahlbezeichnung(wahl, wurzelgebiet, wahlParameterFct).ifPresent(result::add);
    overrideDokumentPlatzhalterZuWaehlendesGremium(wahl, wurzelgebiet, wahlParameterFct).ifPresent(result::add);

    return result;
  }

  private Optional<WahlParameter> overrideDokumentPlatzhalterWahlbezeichnung(Wahl wahl, Gebiet wurzelgebiet, Function<WahlParameterWerte, WahlParameter> wahlParameterFct) {
    return getDokumentPlatzhalter(wahl, wahlParameterFct, WahlParameterWerte.DOKUMENT_PLATZHALTER_WAHLBEZEICHNUNG,
        NlWahlCreateData.bestimmeDokumentPlatzhalterWahlbezeichnung(messages, wahl, wurzelgebiet));
  }

  private Optional<WahlParameter> overrideDokumentPlatzhalterZuWaehlendesGremium(Wahl wahl, Gebiet wurzelgebiet, Function<WahlParameterWerte, WahlParameter> wahlParameterFct) {
    return getDokumentPlatzhalter(wahl, wahlParameterFct, WahlParameterWerte.DOKUMENT_PLATZHALTER_ZU_WAEHLENDES_GREMIUM,
        NlWahlCreateData.bestimmeDokumentPlatzhalterZuWaehlendesGremium(messages, wahl, wurzelgebiet));
  }

  private Optional<WahlParameter> getDokumentPlatzhalter(Wahl wahl, Function<WahlParameterWerte, WahlParameter> wahlParameterFct, WahlParameterWerte wahlParameterWerte, String wert) {
    if (isNotBlank(wert)) {
      WahlParameter wahlParameter = wahlParameterFct.apply(wahlParameterWerte);

      if (wahlParameter == null) {
        LOG.warn("Sonderbehandlung Dokumentplatzhalter {} - Wahlparameter {} NICHT gefunden", NlWahlart.valueOf(wahl), wahlParameterWerte);
      } else {
        wahlParameter.setWert(wert);

        LOG.info("Sonderbehandlung Dokumentplatzhalter {} - Wahlparameter {} ueberschrieben mit {}", NlWahlart.valueOf(wahl), wahlParameterWerte, wert);

        return Optional.of(wahlParameter);
      }
    }

    return Optional.empty();
  }
}
