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

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

import javax.inject.Inject;
import javax.inject.Named;

import de.ivu.elect.business.stimmeingabe.boundary.ErgebniseingangKonfiguration;
import de.ivu.elect.business.stimmeingabe.boundary.StimmeingabefehlerExtendedDAO;
import de.ivu.elect.business.stimmeingabe.entity.Ergebniseingang;
import de.ivu.elect.business.wahl.boundary.WahlSessionSelect;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.jee.presentation.dynamictable.AbstractColumnBuilder;
import de.ivu.elect.jee.presentation.dynamictable.ColumnEntry;
import de.ivu.elect.presentation.gebietsbaum.GebietNummerFormatter;
import de.ivu.elect.presentation.stimmeingabe.status.ErgebniseingangStatusEntryFactory;

@Named(ErgebniseingangColumnBuilder.COMPONENT_NAME)
public class ErgebniseingangColumnBuilder extends AbstractColumnBuilder<Ergebniseingang> {

  private static final long serialVersionUID = 1L;

  public static final String COMPONENT_NAME = "ergebniseingangColumnBuilder";

  @Inject
  private transient StimmeingabefehlerExtendedDAO stimmeingabefehlerExtendedDAO;

  @Inject
  private transient ErgebniseingangKonfiguration ergebniseingangKonfiguration;

  @Inject
  private transient WahlSessionSelect wahlSessionSelect;

  @Inject
  private transient GebietNummerFormatter gebietNummerFormatter;

  protected AbstractErgebniseingangColumn<Ergebniseingang> ergebniseingangZeitstempelColumn;

  protected AbstractErgebniseingangColumn<Ergebniseingang> ergebniseingangGebietNameColumn;

  protected AbstractErgebniseingangColumn<Ergebniseingang> ergebniseingangGebietNummerColumn;

  protected AbstractErgebniseingangColumn<Ergebniseingang> ergebniseingangEingangssequenznummerColumn;

  protected AbstractErgebniseingangColumn<Ergebniseingang> ergebniseingangErgebnissequenznummerColumn;

  protected AbstractErgebniseingangColumn<Ergebniseingang> ergebniseingangErgebniseingangsartColumn;

  protected AbstractErgebniseingangColumn<Ergebniseingang> ergebniseingangErgebniseingabestufeColumn;

  protected AbstractErgebniseingangColumn<Ergebniseingang> ergebniseingangErgebniseingangsherkunftColumn;

  protected AbstractErgebniseingangColumn<Ergebniseingang> ergebniseingangErgebniseingangsfehlerstatusColumn;

  protected AbstractErgebniseingangColumn<Ergebniseingang> ergebniseingangErfasserColumn;

  protected AbstractErgebniseingangColumn<Ergebniseingang> ergebniseingangFehlerWarnungColumn;

  public ErgebniseingangColumnBuilder() {
    super();
  }

  @Override
  protected void initColumns() {
    ergebniseingangZeitstempelColumn = AbstractErgebniseingangColumn.createErgebniseingangZeitstempelColumn(getMessages());

    ergebniseingangGebietNameColumn = new ErgebniseingangGebietsnameColumn(getMessages());
    ergebniseingangGebietNummerColumn = new ErgebniseingangGebietsnummerColumn(getMessages(), gebietNummerFormatter);

    ergebniseingangEingangssequenznummerColumn = AbstractErgebniseingangColumn.createErgebniseingangEingangssequenznummerColumn(getMessages());
    ergebniseingangErgebnissequenznummerColumn = AbstractErgebniseingangColumn.createErgebniseingangErgebnissequenznummerColumn(getMessages());

    ergebniseingangErgebniseingangsartColumn = AbstractErgebniseingangColumn.createErgebniseingangErgebniseingangsartColumn(getMessages());
    ergebniseingangErgebniseingabestufeColumn = AbstractErgebniseingangColumn.createErgebniseingangErgebniseingabestufeColumn(getMessages());
    ergebniseingangErgebniseingangsherkunftColumn = AbstractErgebniseingangColumn.createErgebniseingangErgebniseingangsherkunftColumn(getMessages());

    ergebniseingangErgebniseingangsfehlerstatusColumn = AbstractErgebniseingangColumn.createErgebniseingangErgebniseingangsfehlerstatusColumn(getMessages());
    ergebniseingangErgebniseingangsfehlerstatusColumn.setTooltipFct(ergebniseingang -> {
      if (ergebniseingang.isGueltig()) {
        return null;
      }

      return ErgebniseingangStatusEntryFactory.formatFehlerbeschreibungenTooltip(ergebniseingang, stimmeingabefehlerExtendedDAO);
    });

    ergebniseingangErfasserColumn = AbstractErgebniseingangColumn.createErgebniseingangErfasserColumn(getMessages());

    ergebniseingangFehlerWarnungColumn = new ErgebniseingangWarnungFehlerColumn(getMessages(), stimmeingabefehlerExtendedDAO);
  }

  @Override
  protected List<ColumnEntry< ? super Ergebniseingang>> getColumnEntriesSorted() {
    List<ColumnEntry< ? super Ergebniseingang>> result = new ArrayList<>();

    Wahl wahl = getSelectedWahl();

    result.add(ergebniseingangZeitstempelColumn);

    if (ergebniseingangKonfiguration.isWechselErgebniseingangsartenUnterstuetzt(wahl)) {
      result.add(ergebniseingangErgebniseingangsartColumn);
    }

    if (ergebniseingangKonfiguration.isWechselErgebniseingabestufenUnterstuetzt(wahl)) {
      result.add(ergebniseingangErgebniseingabestufeColumn);
    }

    result.add(ergebniseingangErgebniseingangsfehlerstatusColumn);

    result.add(ergebniseingangGebietNameColumn);
    result.add(ergebniseingangGebietNummerColumn);

    result.add(ergebniseingangErfasserColumn);

    result.add(ergebniseingangErgebniseingangsherkunftColumn);

    result.add(ergebniseingangEingangssequenznummerColumn);
    result.add(ergebniseingangErgebnissequenznummerColumn);
    result.add(ergebniseingangFehlerWarnungColumn);

    return result;
  }

  private Wahl getSelectedWahl() {
    return wahlSessionSelect.getEntity();
  }
}
