
package de.ivu.elect.business.ui.boundary;

import static java.util.stream.Collectors.toMap;

import java.io.Serializable;
import java.util.List;
import java.util.Map;
import java.util.function.Function;

import javax.ejb.Stateless;
import javax.inject.Inject;

import de.ivu.elect.business.security.control.ElectCommonPrincipal;
import de.ivu.elect.business.ui.boundary.UITableColumnOrderDAO;
import de.ivu.elect.business.ui.entity.UITableColumnOrder;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.Wahltermin;
import de.ivu.elect.jee.presentation.dynamictable.ColumnBuilder;

@Stateless
public class UITableColumnReihenfolgeFestlegenEdit implements Serializable {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient UITableColumnOrderDAO uiTableColumnOrderDAO;

  @Inject
  private transient UITableColumnOrderKonfiguration uiTableColumnOrderKonfiguration;

  public UITableColumnReihenfolgeFestlegenEdit() {
    super();
  }

  public void save(ElectCommonPrincipal principal, Wahl wahl, Wahltermin wahltermin, ColumnBuilder< ? > columnBuilder, List<UITableColumnOrder> columnsAngezeigt,
      List<UITableColumnOrder> columnsVerfuegbar) {
    long position = 1L;

    for (UITableColumnOrder uiTableColumnOrder : columnsAngezeigt) {
      uiTableColumnOrder.setPosition(position++);
    }

    List<UITableColumnOrder> columnsInDb = uiTableColumnOrderKonfiguration.collectColumnsInDb(principal, wahl, wahltermin, columnBuilder, uiTableColumnOrderDAO);
    Map<String, UITableColumnOrder> columnInDbPerColumnKey = columnsInDb.stream().collect(toMap(UITableColumnOrder::getColumnKey, Function.identity()));

    Map<String, UITableColumnOrder> columnAngezeigtPerColumnKey = columnsAngezeigt.stream().collect(toMap(UITableColumnOrder::getColumnKey, Function.identity()));

    for (UITableColumnOrder uiTableColumnOrder : columnsInDb) {
      String columnKey = uiTableColumnOrder.getColumnKey();

      if (columnAngezeigtPerColumnKey.containsKey(columnKey)) {
        uiTableColumnOrder.setAnzeigen(true);
        uiTableColumnOrder.setPosition(columnAngezeigtPerColumnKey.get(columnKey).getPosition());
      } else {
        uiTableColumnOrder.setAnzeigen(false);
      }
    }

    for (UITableColumnOrder uiTableColumnOrder : columnsAngezeigt) {
      String columnKey = uiTableColumnOrder.getColumnKey();

      if (!columnInDbPerColumnKey.containsKey(columnKey)) {
        uiTableColumnOrder.setAnzeigen(true);

        uiTableColumnOrderKonfiguration.persistColumnInDb(principal, wahl, wahltermin, columnBuilder, uiTableColumnOrder, uiTableColumnOrderDAO);
      }
    }

    for (UITableColumnOrder uiTableColumnOrder : columnsVerfuegbar) {
      String columnKey = uiTableColumnOrder.getColumnKey();

      if (!columnInDbPerColumnKey.containsKey(columnKey) && !columnAngezeigtPerColumnKey.containsKey(columnKey)) {
        uiTableColumnOrder.setAnzeigen(false);
        uiTableColumnOrder.setPosition(position++);

        uiTableColumnOrderKonfiguration.persistColumnInDb(principal, wahl, wahltermin, columnBuilder, uiTableColumnOrder, uiTableColumnOrderDAO);
      }
    }
  }

  public void reset(ElectCommonPrincipal principal, Wahl wahl, Wahltermin wahltermin, ColumnBuilder< ? > columnBuilder) {
    uiTableColumnOrderKonfiguration.removeColumnsInDb(principal, wahl, wahltermin, columnBuilder, uiTableColumnOrderDAO);
  }
}
