
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.CurrentCustomer;
import de.ivu.elect.business.gebietsbaum.boundary.GebietExtendedDAO;
import de.ivu.elect.business.gebietsbaum.boundary.NlGebietDarstellungNummerFormatter;
import de.ivu.elect.business.gebietsbaum.control.EntityMitWurzelgebietDAO;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.security.Customer;
import de.ivu.elect.business.wahl.entity.NlWahlart;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.jee.presentation.dynamictable.ColumnEntry;
import de.ivu.elect.presentation.mandant.MandantSessionSelect;
import de.ivu.elect.presentation.security.NlPrivatePublicKeyNeeded;
import de.ivu.elect.presentation.table.AbstractColumnEntry;

@Specializes
public class NlWasGebietColumnBuilderHelper extends WasGebietColumnBuilderHelper {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient GebietExtendedDAO gebietExtendedDAO;

  @Inject
  private transient CurrentCustomer currentCustomer;

  @Inject
  private transient MandantSessionSelect mandantSessionSelect;

  @Inject
  private transient NlPrivatePublicKeyNeeded nlPrivatePublicKeyNeeded;

  @Inject
  private transient NlGebietDarstellungNummerFormatter nlGebietDarstellungNummerFormatter;

  private AbstractColumnEntry<Gebiet> gebietDarstellungNummerColumn;

  private AbstractColumnEntry<Gebiet> gebietAnschriftPlzColumn;

  private AbstractColumnEntry<Gebiet> gebietAnzahlWahlberechtigteColumn;

  private AbstractColumnEntry<Gebiet> gebietPublicKeyVorhandenColumn;

  private Customer customer;

  public NlWasGebietColumnBuilderHelper() {
    super();
  }

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

    gebietGebietsartNameMitIconColumn = new NlGebietGebietsartNameMitIconColumn(messages, gebietsbaumTreeNodeIconResolver);
    gebietDarstellungNummerColumn = new NlGebietDarstellungNummerColumn(messages, nlGebietDarstellungNummerFormatter);
    gebietAnschriftPlzColumn = new NlGebietAnschriftPlzColumn(messages);
    gebietAnzahlWahlberechtigteColumn = new NlWasGebietAnzahlWahlberechtigteColumn(messages);
    gebietPublicKeyVorhandenColumn = new NlWasGebietPublicKeyVorhandenColumn(messages, gebietExtendedDAO);
  }

  @Override
  public List<ColumnEntry< ? super Gebiet>> getColumnEntriesSorted() {
    List<ColumnEntry< ? super Gebiet>> result = new ArrayList<>(); // eigene Spalten für NL ELECT-9733

    // Cf. NlWusGebietColumnBuilderHelper#getColumnEntriesSorted!!!
    result.add(gebietNameColumn); // ELECTVAPP-314
    result.add(gebietGebietsartNameMitIconColumn);
    result.add(gebietDarstellungNummerColumn); // ELECTVAPP-692

    if (NlWahlart.isWasGemeinde(() -> {
      Wahl wahl = getSelectedWahl();

      if (wahl != null) {
        return wahl.getWurzelgebiet(EntityMitWurzelgebietDAO.fromDao(gebietExtendedDAO));
      }

      return null;
    }, getCurrentCustomer())) {
      result.add(gebietAnzahlWahlberechtigteColumn);
    }

    if (!isCsbOderHsb() /* ELECTVAPP-1033 */) {
      result.add(gebietAnschriftPlzColumn); //ELECTVAPP-382
    }

    if (nlPrivatePublicKeyNeeded.isPublicKeyNeeded(mandantSessionSelect.getMandant())) {
      result.add(gebietPublicKeyVorhandenColumn);
    }

    return result;
  }

  private boolean isCsbOderHsb() {
    return NlWahlart.isWasCSB(getSelectedWahl(), getCurrentCustomer()) || NlWahlart.isWasHSB(getSelectedWahl(), getCurrentCustomer());
  }

  private Customer getCurrentCustomer() {
    if (customer == null) {
      customer = currentCustomer.getCustomer();
    }
    return customer;
  }

}
