
package de.ivu.elect.presentation.gebietsbaum.table;

import java.util.ArrayList;
import java.util.List;

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

import de.ivu.elect.business.gebietsbaum.boundary.WahldurchfuehrungsgebietExtendedDAO;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.business.stimmeingabe.entity.Ergebniseingangsart;
import de.ivu.elect.business.wahl.boundary.WahldurchfuehrungSessionSelect;
import de.ivu.elect.business.wahl.entity.Wahlart;
import de.ivu.elect.business.wahl.entity.Wahldurchfuehrung;
import de.ivu.elect.jee.presentation.dynamictable.ColumnEntry;
import de.ivu.elect.jee.presentation.dynamictable.ColumnType;

@Specializes
public class WasGebietColumnBuilderHelper extends GebietColumnBuilderHelper {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient WahldurchfuehrungSessionSelect wahldurchfuehrungSessionSelect;

  @Inject
  private transient WahldurchfuehrungsgebietExtendedDAO wahldurchfuehrungsgebietExtendedDAO;

  private AbstractWahldurchfuehrungsgebietColumn gebietEingabestatusVorlaeufigColumn;

  private AbstractWahldurchfuehrungsgebietColumn gebietEingabestatusEndgueltigColumn;

  private AbstractWahldurchfuehrungsgebietColumn gebietWahlartBeiAufteilungColumn;

  @Override
  public void initColumns() {
    super.initColumns();

    gebietEingabestatusVorlaeufigColumn = AbstractWahldurchfuehrungsgebietColumn.createWahldurchfuehrungsgebietEingabestatusVorlaeufigColumn(messages);
    gebietEingabestatusEndgueltigColumn = AbstractWahldurchfuehrungsgebietColumn.createWahldurchfuehrungsgebietEingabestatusEndgueltigColumn(messages);

    gebietWahlartBeiAufteilungColumn = AbstractWahldurchfuehrungsgebietColumn.createWahlartBeiAufteilungColumn(messages, ColumnType.STRING, g -> {
      Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet = wahldurchfuehrungsgebietExtendedDAO.findByPrimaryKey(g.getPk());

      if (wahldurchfuehrungsgebiet.getWahlartBeiAufteilung() != null || wahldurchfuehrungsgebiet.getVerantwortlicherMandant() != null
          || wahldurchfuehrungsgebiet.getGebietsart().getSystemGebietsebene().isVorhanden()) {

        Wahlart wahlartBeiAufteilung = wahldurchfuehrungsgebiet.bestimmeWahlartBeiAufteilung();
        if (wahlartBeiAufteilung != null) {

          // ELECT-8523
          String msgKey = "wahlart.bei.aufteilung.fallback";
          if (wahldurchfuehrungsgebiet.getWahlartBeiAufteilung() != null) {
            msgKey = "wahlart.bei.aufteilung.gebiet.selbst";
          } else if (wahldurchfuehrungsgebiet.getGebietsarteigenschaft() != null && wahldurchfuehrungsgebiet.getGebietsarteigenschaft().getWahlartBeiAufteilung() != null) {
            msgKey = "wahlart.bei.aufteilung.wahlart";
          }
          return messages.getMessageForMessageKey(msgKey, wahlartBeiAufteilung.getNameGuiEindeutig());
        }
      }

      return null;
    });

  }

  @Override
  public List<ColumnEntry< ? super Gebiet>> getColumnEntriesSorted() {
    List<ColumnEntry< ? super Gebiet>> result = new ArrayList<>(super.getColumnEntriesSorted());

    if (principal.hasUseCasePermission(UseCasePermission.WAHL_FUER_SUBSYSTEME_KONFIGURIEREN) && mandantSupport.isMandantenUnterstuetzt()) {
      result.add(gebietWahlartBeiAufteilungColumn);
    }

    if (isWahlSelected()) {
      Ergebniseingangsart ergebniseingangsart = getSelectedWahl().getErgebniseingangsart();

      if (ergebniseingangsart.isVorlaeufig()) {
        result.add(gebietEingabestatusVorlaeufigColumn);
      }

      if (ergebniseingangsart.isEndgueltig()) {
        result.add(gebietEingabestatusEndgueltigColumn);
      }
    } else {
      result.add(gebietEingabestatusVorlaeufigColumn);
      result.add(gebietEingabestatusEndgueltigColumn);
    }

    return result;
  }

  protected boolean isWahlSelected() {
    return wahldurchfuehrungSessionSelect.isSelected();
  }

  protected Wahldurchfuehrung getSelectedWahl() {
    return wahldurchfuehrungSessionSelect.getEntity();
  }
}
