
package de.ivu.elect.dokumente.ergebnis.gesamtergebnis;

import static org.apache.commons.lang3.StringUtils.right;
import static org.apache.commons.lang3.StringUtils.trimToEmpty;

import java.util.List;

import java.util.Objects;

import de.ivu.elect.business.wahl.entity.CommonWahlart;
import de.ivu.elect.business.wahl.entity.Wahldurchfuehrung;
import de.ivu.elect.dokumente.ergebnis.ErgebnisDocumentGebietDocument;

public class EuwErgebnisGesamtergebnisTabellarischDocumentExportMapper extends AbstractErgebnisGesamtergebnisTabellarischDocumentExportMapper {

  public static final String FILE_FORMAT_NAME = "file.format.gesamtergebnis.v7.euw.document.muc";

  public static final String ERFASSUNGSGEBIET_GEBIETSREFERENZ_FORMAT = "%2$s %3$s"; // ELECT-8697

  public EuwErgebnisGesamtergebnisTabellarischDocumentExportMapper() {
    super(ERFASSUNGSGEBIET_GEBIETSREFERENZ_FORMAT);
  }

  protected EuwErgebnisGesamtergebnisTabellarischDocumentExportMapper(String erfassungsgebietGebietsreferenzFormat) {
    super(erfassungsgebietGebietsreferenzFormat);
  }

  @Override
  protected boolean isAcceptContext(Wahldurchfuehrung wahldurchfuehrung) {
    return CommonWahlart.EUROPAWAHL.equalsWahlart(wahldurchfuehrung);
  }

  @Override
  protected String getFileFormatName() {
    return FILE_FORMAT_NAME;
  }

  @Override
  protected void postProcessSeitenUndTeile(List<ErgebnisGesamtergebnisTabellarischDocument> documents) {
    super.postProcessSeitenUndTeile(documents);

    for (ErgebnisGesamtergebnisTabellarischDocument document : documents) {
      formatGemeindeNummer(document.gemeindeverband);
      formatGemeindeNummer(document.gemeinde);

      String documentDatenGebietNummer = document.datenGebiet.nummer;

      if (Objects.equals(documentDatenGebietNummer, document.gemeindeverband.nummer) || Objects.equals(documentDatenGebietNummer, document.gemeinde.nummer)) {
        formatGemeindeNummer(document.datenGebiet);
      }

      for (ErgebnisGesamtergebnisTabellarischDocumentZeile zeile : document.getZeilen()) {
        formatGemeindeNummer(zeile.gemeindeverband);
        formatGemeindeNummer(zeile.gemeinde);

        String zeileDatenGebietNummer = zeile.datenGebiet.nummer;

        if (Objects.equals(zeileDatenGebietNummer, zeile.gemeindeverband.nummer) || Objects.equals(zeileDatenGebietNummer, zeile.gemeinde.nummer)) {
          formatGemeindeNummer(zeile.datenGebiet);
        }
      }
    }
  }

  private void formatGemeindeNummer(ErgebnisDocumentGebietDocument gebietDocument) {
    gebietDocument.nummerFormatiert = trimToEmpty(right(gebietDocument.nummer, 6)); // ELECTKOM-365
  }
}
