
package de.ivu.elect.presentation.gruppe;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.inject.Named;

import org.apache.deltaspike.core.api.scope.ViewAccessScoped;

import de.ivu.elect.business.security.UseCasePermission;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.jee.presentation.dynamictable.ColumnType;
import de.ivu.elect.presentation.View;
import de.ivu.elect.presentation.gruppe.form.GruppeNachErfassungsgebietStimmenWerteProperty;
import de.ivu.elect.presentation.gruppe.form.GruppeNachErfassungsgebietStimmenWerteValidator;
import de.ivu.elect.presentation.gruppe.form.SvgAnzahlEinteilungProperty;
import de.ivu.elect.presentation.gruppe.form.SvgArtEinteilungProperty;
import de.ivu.elect.presentation.gruppe.form.SvgLegendePositionHorizontalProperty;
import de.ivu.elect.presentation.gruppe.form.SvgLegendePositionVertikalProperty;
import de.ivu.elect.presentation.gruppe.table.AbstractGruppeKumulierteStimmenColumn;
import de.ivu.elect.presentation.hilfe.OnlineHilfeId;

@OnlineHilfeId("812")
@ViewAccessScoped
@View(viewId = GruppeNachErfassungsgebietStimmenGrafischSearchView.VIEW_ID, useCase = UseCasePermission.ERGEBNIS_GRUPPEN_NACH_GEBIETEN_ANZEIGEN)
@Named(GruppeNachErfassungsgebietStimmenGrafischSearchView.COMPONENT_NAME)
public class GruppeNachErfassungsgebietStimmenGrafischSearchView extends AbstractGruppeNachErfassungsgebietStimmenSearchView {

  private static final long serialVersionUID = 1L;

  public static final String COMPONENT_NAME = "gruppeNachErfassungsgebietStimmenGrafischSearchView";

  public static final String VIEW_ID = "/gruppe/gruppe-nach-erfassungsgebiet-stimmen-grafisch-search.xhtml";

  public GruppeNachErfassungsgebietStimmenGrafischSearchView() {
    super();
  }

  @Override
  protected String getViewId() {
    return VIEW_ID;
  }

  @Override
  public void addProperties(FormBuilder formBuilder) {
    super.addProperties(formBuilder);

    formBuilder.addProperty(getSearchParameters().getSuchergebnisDarstellungGrafischProperty());

    formBuilder.addSeparator("gruppe.nach.gebiet.gruppe.und.gebiet");
    addGebietGruppeProperties(formBuilder);

    formBuilder.addSeparator("gruppe.nach.gebiet.grafische.darstellung");
    formBuilder.addProperty(getSearchParameters().getChartGroesseProperty()); // Chart + SVG

    // NUR Chart
    formBuilder.addProperty(getSearchParameters().getGruppenDarstellungProperty());
    formBuilder.addProperty(getSearchParameters().getGebietDarstellungProperty());
    formBuilder.addProperty(getSearchParameters().getGruppeNachErfassungsgebietStimmenGruppierungProperty());

    List<String> darzustellendeWerteGrafischValues = new ArrayList<>();
    Map<String, ColumnType> darzustellendeWerteGrafischValuesColumnTypeMapping = new HashMap<>();

    for (AbstractGruppeKumulierteStimmenColumn column : gruppeNachErfassungsgebietStimmenColumnBuilder.collectColumnsContainingDarzustellendeWerteGrafisch()) {
      String columnKey = gruppeNachErfassungsgebietStimmenColumnBuilder.getHeaderIgnoringErgebnisartFuerDifferenz(column);

      darzustellendeWerteGrafischValuesColumnTypeMapping.put(columnKey, column.getType());
      darzustellendeWerteGrafischValues.add(columnKey);
    }

    // Chart + SVG
    formBuilder.addProperty(new GruppeNachErfassungsgebietStimmenWerteProperty(darzustellendeWerteGrafischValues,
            getSearchParameters()::setDarzustellendeWerteGrafisch, getSearchParameters()::getDarzustellendeWerteGrafisch))
        .withValidator(new GruppeNachErfassungsgebietStimmenWerteValidator(darzustellendeWerteGrafischValuesColumnTypeMapping));

    // NUR SVG
    formBuilder.addSeparator("gruppe.nach.gebiet.svg.optionen");
    formBuilder.addProperty(new SvgAnzahlEinteilungProperty(getSearchParameters()));
    formBuilder.addProperty(new SvgArtEinteilungProperty(getSearchParameters()));
    formBuilder.addProperty(new SvgLegendePositionHorizontalProperty(getSearchParameters()));
    formBuilder.addProperty(new SvgLegendePositionVertikalProperty(getSearchParameters()));
  }
}
