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

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

import javax.inject.Named;

import de.ivu.elect.business.ergebnis.entity.ParteienwechselSearchResult;
import de.ivu.elect.business.gebietsbaum.entity.GebietConstants;
import de.ivu.elect.jee.presentation.dynamictable.AbstractColumnGroupBuilder;
import de.ivu.elect.jee.presentation.dynamictable.ColumnGroup;
import de.ivu.elect.presentation.gebietsbaum.table.GebietNameColumn;
import de.ivu.elect.presentation.gebietsbaum.table.GebietNummerBezirkOderNummerColumn;
import de.ivu.elect.presentation.gruppe.table.AbstractGruppeColumn;

@Named(ParteienwechselColumnBuilder.COMPONENT_NAME)
public class ParteienwechselColumnBuilder extends AbstractColumnGroupBuilder<ParteienwechselSearchResult> {

  public static final String COMPONENT_NAME = "parteienwechselColumnBuilder";

  private static final long serialVersionUID = 1L;

  private ParteienwechselLaufendeNummerColumn parteienwechselLaufendeNummerColumn;

  private ColumnGroup<ParteienwechselSearchResult> parteienwechselLaufendeNummerColumnGroup;

  protected ColumnGroup<ParteienwechselSearchResult> gebietGroup;

  private ParteienwechselGebietNummerColumn parteienwechselGebietNummerColumn;

  private ParteienwechselGebietNameColumn parteienwechselGebietNameColumn;

  private ColumnGroup<ParteienwechselSearchResult> gewinnerAktuellGroup;

  private ColumnGroup<ParteienwechselSearchResult> gewinnerVorperiodeGroup;

  private ParteienwechselParteiColumn aktuellParteienwechselParteiColumn;
  private ParteienwechselParteiColumn vorperiodeParteienwechselParteiColumn;

  private ParteienwechselStimmenanteilColumn parteienwechselStimmenanteilGewinnerAktuellColumn;
  private ParteienwechselStimmenanteilColumn parteienwechselStimmenanteilGewinnerVorperiodeColumn;

  private ParteienwechselGewinnVerlustColumn parteienwechselGewinnVerlustGewinnerAktuellColumn;
  private ParteienwechselGewinnVerlustColumn parteienwechselGewinnVerlustGewinnerVorperiodeColumn;

  public ParteienwechselColumnBuilder() {
    super();
  }

  @Override
  protected void initColumnGroups() {
    parteienwechselLaufendeNummerColumnGroup = createSingleColumnColumnGroup(parteienwechselLaufendeNummerColumn);
    gebietGroup = new ColumnGroup<>(getMessage(GebietConstants.MESSAGE_KEY_ENTITY_EINZAHL));
    gebietGroup.addColumn(parteienwechselGebietNummerColumn);
    gebietGroup.addColumn(parteienwechselGebietNameColumn);
    gewinnerAktuellGroup = new ColumnGroup<>(getMessage("parteienwechsel.header.gewinner") + " " + getWahlTextAktuell());
    gewinnerAktuellGroup.addColumn(aktuellParteienwechselParteiColumn);
    gewinnerAktuellGroup.addColumn(parteienwechselStimmenanteilGewinnerAktuellColumn);
    gewinnerAktuellGroup.addColumn(parteienwechselGewinnVerlustGewinnerAktuellColumn);
    gewinnerVorperiodeGroup = new ColumnGroup<>(getMessage("parteienwechsel.header.gewinner") + " " + getWahlTextVorperiode());
    gewinnerVorperiodeGroup.addColumn(vorperiodeParteienwechselParteiColumn);
    gewinnerVorperiodeGroup.addColumn(parteienwechselStimmenanteilGewinnerVorperiodeColumn);
    gewinnerVorperiodeGroup.addColumn(parteienwechselGewinnVerlustGewinnerVorperiodeColumn);

  }

  protected String getWahlTextVorperiode() {
    return getMessage("parteienwechsel.header.vorperiode");
  }

  protected String getWahlTextAktuell() {
    return getMessage("parteienwechsel.header.aktuell");
  }

  @Override
  protected List<ColumnGroup< ? super ParteienwechselSearchResult>> getColumnGroupsSorted() {
    List<ColumnGroup< ? super ParteienwechselSearchResult>> result = new ArrayList<>();
    result.add(parteienwechselLaufendeNummerColumnGroup);
    result.add(gebietGroup);
    result.add(gewinnerAktuellGroup);
    result.add(gewinnerVorperiodeGroup);
    return result;
  }

  @Override
  protected void initColumns() {
    parteienwechselLaufendeNummerColumn = new ParteienwechselLaufendeNummerColumn(getMessages());
    parteienwechselGebietNummerColumn = new ParteienwechselGebietNummerColumn(getMessages(), new GebietNummerBezirkOderNummerColumn(getMessages()));
    parteienwechselGebietNameColumn = new ParteienwechselGebietNameColumn(getMessages(), new GebietNameColumn(getMessages()));
    aktuellParteienwechselParteiColumn = new ParteienwechselParteiColumn(getMessages(), AbstractGruppeColumn.createGruppeKurznameColumn(getMessages()),
        ParteienwechselSearchResult::getAktuellerGewinner);
    vorperiodeParteienwechselParteiColumn = new ParteienwechselParteiColumn(getMessages(), AbstractGruppeColumn.createGruppeKurznameColumn(getMessages()),
        ParteienwechselSearchResult::getVorperiodeGewinner);
    parteienwechselStimmenanteilGewinnerAktuellColumn = new ParteienwechselStimmenanteilColumn(getMessages(), ParteienwechselSearchResult::getStimmenanteilAktuellGewinnerAktuell);
    parteienwechselStimmenanteilGewinnerVorperiodeColumn = new ParteienwechselStimmenanteilColumn(getMessages(), ParteienwechselSearchResult::getStimmenanteilAktuellGewinnerVorperiode);
    parteienwechselGewinnVerlustGewinnerAktuellColumn = new ParteienwechselGewinnVerlustColumn(getMessages(), ParteienwechselSearchResult::getGewinnVerlustGewinnerAktuell, getWahlTextVorperiode());
    parteienwechselGewinnVerlustGewinnerVorperiodeColumn = new ParteienwechselGewinnVerlustColumn(getMessages(), ParteienwechselSearchResult::getGewinnVerlustGewinnerVorperiode,
        getWahlTextVorperiode());
  }
}
