
package de.ivu.elect.was.exchange.ergebnis.eml;

import java.util.List;

import javax.annotation.Nullable;
import javax.inject.Inject;

import de.ivu.elect.business.wahl.entity.NlWahlart;
import de.ivu.elect.business.wahl.entity.Wahldurchfuehrung;
import de.ivu.elect.nl.met.RegionCategoryType;
import de.ivu.elect.util.FileUtil;
import org.apache.commons.lang3.StringUtils;

import de.ivu.elect.business.datei.entity.FileType;
import de.ivu.elect.business.ergebnis.control.ErgebnisExportContext;
import de.ivu.elect.business.ergebnis.control.ErgebnisExportObject;
import de.ivu.elect.business.exchange.control.FileFormat;
import de.ivu.elect.business.gebietsbaum.boundary.NlGebietDarstellungNummerFormatter;
import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.nl.eml.readable.ReportingUnitVotesWrapper;

public class Eml510bPSBErgebnisExportMapper extends Abstract510ErgebnisExportMapper {

  private static final long serialVersionUID = 1L;

  public static final FileFormat FILE_FORMAT = new FileFormat("eml.510b.file.format", FileType.ZIP);

  @Inject
  private transient NlGebietDarstellungNummerFormatter nlGebietDarstellungNummerFormatter;

  public Eml510bPSBErgebnisExportMapper() {
    super();
  }

  @Override
  protected String getEmlId() {
    return "510b";
  }

  @Override
  public FileFormat getFileFormat() {
    return FILE_FORMAT;
  }

  @Override
  public boolean isSignEml(Wahl wahl) {
    return !(isHSB(wahl) && isCSB(wahl)); // ELECTVAPP-718, siehe auch https://confluence.ivu.de/pages/viewpage.action?spaceKey=VAPP&title=EML-Import+validation...
  }

  @Override
  protected boolean isPsbNotwendig() {
    return true;
  }

  @Override
  protected boolean isHsbNotwendig() {
    return false;
  }

  @Override
  protected boolean isCsbNotwendig() {
    return false;
  }

  @Override
  protected boolean isGebietAuswahlNotwendig() {
    return false;
  }

  @Override
  protected boolean isErfassungsgebietAuswahlNotwendig() {
    return false;
  }

  @Override
  protected boolean isErgebnisNotwendig() {
    return true;
  }

  @Override
  protected List<Wahldurchfuehrungsgebiet> bestimmeReportingUnitGebiete(ErgebnisExportObject ergebnisExportObject, ErgebnisExportContext context) {
    return ergebnisExportObject.getErgebnisDaten().getErfassungsgebiete();
  }

  @Nullable
  @Override
  protected Wahldurchfuehrungsgebiet bestimmeTotalVotesGebiet(ErgebnisExportObject ergebnisExportObject, ErgebnisExportContext context) {
    return ergebnisExportObject.getErgebnisDaten().getWurzelgebiet();
  }

  @Nullable
  @Override
  protected Wahldurchfuehrungsgebiet bestimmeGebietFuerDaten(ErgebnisExportObject ergebnisExportObject, ErgebnisExportContext context) {
    return ergebnisExportObject.getErgebnisDaten().getWurzelgebiet();
  }

  @Override
  protected String getAuthorityIdPrefix(ErgebnisExportObject ergebnisExportObject) {
    return "";
  }

  @Override
  protected String createdByAuthorityIdPrefix(ErgebnisExportObject ergebnisExportObject) {
    return "";
  }

  @Override
  protected void fillReportingUnit(Wahldurchfuehrungsgebiet reportingUnitGebiet, ReportingUnitVotesWrapper reportingUnitVotesWrapper) {
    // ELECTVAPP-491
    reportingUnitVotesWrapper.setId(
        getMessage("eml510b.reporting.unit.id.stimmbuero", reportingUnitGebiet.getNummer(), nlGebietDarstellungNummerFormatter.formatiereNummer(reportingUnitGebiet.getUebergeordnetesGebiet())));

    if (StringUtils.isBlank(reportingUnitGebiet.getAnschrift().getPlz())) {
      reportingUnitVotesWrapper.setName(getMessage("eml510b.reporting.unit.name.stimmbuero.ohne.plz", reportingUnitGebiet.getName()));
    } else {
      reportingUnitVotesWrapper.setName(getMessage("eml510b.reporting.unit.name.stimmbuero", reportingUnitGebiet.getName(), reportingUnitGebiet.getAnschrift().getPlz()));
    }
  }
}
