package de.ivu.elect.presentation.ergebniskonflikt;

import java.util.List;
import java.util.stream.Collectors;

import javax.enterprise.inject.Specializes;
import javax.inject.Inject;

import de.ivu.elect.business.ergebniskonflikt.entity.AbstractErgebnisKonflikt;
import org.apache.commons.lang3.StringUtils;

import de.ivu.elect.business.ergebnis.entity.Ergebnis;
import de.ivu.elect.business.ergebniskonflikt.boundary.ErgebnisKonfliktExtendedDAO;
import de.ivu.elect.business.ergebniskonflikt.entity.ErgebnisKonflikt;
import de.ivu.elect.jee.faces.PreConditionCheck;
import de.ivu.elect.presentation.ergebniskonflikt.action.ErgebnisKonfliktEditAction;

@Specializes
public class NlErgebnisKonfliktSearchView extends ErgebnisKonfliktSearchView {
  private static final long serialVersionUID = 1L;

  @Inject
  private transient ErgebnisKonfliktExtendedDAO ergebnisKonfliktExtendedDAO;

  @Inject
  private transient ErgebnisKonfliktEditAction ergebnisKonfliktEditAction;

  @Override
  @PreConditionCheck
  public String checkPreCondition() {

    String result = super.checkPreCondition();
    if (StringUtils.isNotBlank(result)) {
      return result;
    }

    Ergebnis ergebnis = getErgebnis();

    if (ergebnis != null) {
      List<ErgebnisKonflikt> konflikte = ergebnisKonfliktExtendedDAO.findByErgebnisOrderById(ergebnis);
      List<ErgebnisKonflikt> ungeloesteKonflikte = konflikte.stream().filter(e -> !e.isGeloest()).collect(
          Collectors.toList());
      long anzahlGeloesteKonflikte = konflikte.stream().filter(AbstractErgebnisKonflikt::isGeloest).count();

      if (ungeloesteKonflikte.size() == 1 && anzahlGeloesteKonflikte == 0) {
        ErgebnisKonflikt ergebnisKonfliktUngeloest = ungeloesteKonflikte.get(0);
        if (ergebnisKonfliktEditAction.isActionPossible(ergebnisKonfliktUngeloest)) {
          return ergebnisKonfliktEditAction.action(ergebnisKonfliktUngeloest);
        }

      }
    }

    return result;
  }

}
