
package de.ivu.elect.core.exchange.stimmen.csv;

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

import javax.inject.Inject;

import de.ivu.elect.business.ergebnis.control.StimmenImportContext;
import de.ivu.elect.business.ergebnis.entity.Stimmen;
import de.ivu.elect.business.ergebnis.entity.Stimmenart;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.gruppe.entity.Gruppe;
import de.ivu.elect.business.gruppeimgebiet.entity.GruppeImGebiet;
import de.ivu.elect.exchange.csv.CsvMarshaller;

public abstract class AbstractEineStimmenCsvImportMapper extends AbstractStimmenCsvImportMapper<EineStimmenCsvDTO> {

  @Inject
  private transient CsvMarshaller csvMarshaller;

  public AbstractEineStimmenCsvImportMapper() {
    super();
  }

  protected abstract Stimmenart getStimmenart();

  @Override
  protected CsvMarshaller getCsvMarshaller() {
    return csvMarshaller;
  }

  @Override
  protected Class<EineStimmenCsvDTO> getStimmenCsvDTOClass() {
    return EineStimmenCsvDTO.class;
  }

  @Override
  protected void addGueltigeStimmen(List<Stimmen> result, Gebiet gebiet, EineStimmenCsvDTO importStimmen) {
    if (importStimmen.getAnzahlStimmenGueltig() != null) {
      Gruppe gruppeGueltige = createSystemGruppeGueltige();

      GruppeImGebiet gruppeImGebietGueltige = createGruppeImGebietFor(gebiet, gruppeGueltige);

      Stimmen gueltigeStimmen = new Stimmen();
      gueltigeStimmen.setStimmenart(getStimmenart());
      gueltigeStimmen.setGruppe(gruppeImGebietGueltige.getGruppe());
      gueltigeStimmen.setGebiet(gruppeImGebietGueltige.getGebiet());
      gueltigeStimmen.setAnzahl(importStimmen.getAnzahlStimmenGueltig());
      result.add(gueltigeStimmen);
    }
  }

  @Override
  protected void addUngueltigeStimmen(List<Stimmen> result, Gebiet gebiet, EineStimmenCsvDTO importStimmen) {
    if (importStimmen.getAnzahlStimmenUngueltig() != null) {
      Gruppe gruppeUngueltige = createSystemGruppeUngueltige();

      GruppeImGebiet gruppeImGebietUngueltige = createGruppeImGebietFor(gebiet, gruppeUngueltige);

      Stimmen ungueltigeStimmen = new Stimmen();
      ungueltigeStimmen.setStimmenart(getStimmenart());
      ungueltigeStimmen.setGruppe(gruppeImGebietUngueltige.getGruppe());
      ungueltigeStimmen.setGebiet(gruppeImGebietUngueltige.getGebiet());
      ungueltigeStimmen.setAnzahl(importStimmen.getAnzahlStimmenUngueltig());
      result.add(ungueltigeStimmen);
    }
  }

  @Override
  protected List<Stimmen> createStimmenForPolitischeGruppen(StimmenImportContext context,  EineStimmenCsvDTO importStimmen) {
    List<Stimmen> result = new ArrayList<>();

    if (importStimmen.getPolitischeGruppenStimmen() != null) {
      for (EineGruppeStimmenDTO gruppeStimmen : importStimmen.getPolitischeGruppenStimmen()) {

        GruppeImGebiet gruppeImGebiet = mappeGruppeImGebietForGebiet(context, importStimmen.getGebietsart(), importStimmen.getGebietsnummer(), gruppeStimmen.getGruppeSchluessel());

        createStimmenIfAnzahlNotZero(result, gruppeStimmen, gruppeImGebiet);
      }
    }

    return result;
  }

  private void createStimmenIfAnzahlNotZero(List<Stimmen> result, EineGruppeStimmenDTO gruppeStimmen, GruppeImGebiet gruppeImGebiet) {
    if (gruppeStimmen.getAnzahlStimmen() != null) {
      result.add(createStimmen(gruppeStimmen, gruppeImGebiet));
    }
  }

  private Stimmen createStimmen(EineGruppeStimmenDTO parteiStimmen, GruppeImGebiet gruppeImGebiet) {
    return createStimmen(parteiStimmen.getAnzahlStimmen(), getStimmenart(), gruppeImGebiet);
  }
}
