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

import java.util.EnumSet;
import java.util.List;

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

import de.ivu.elect.business.CurrentCustomer;
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.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.wahl.entity.NlWahlart;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahl.entity.Wahldurchfuehrung;
import de.ivu.elect.nl.eml.readable.ReportingUnitVotesWrapper;
import de.ivu.elect.presentation.gebietsbaum.GebietNummerFormatter;
import de.ivu.elect.util.FileUtil;


import static org.apache.commons.lang3.StringUtils.isBlank;

public class Eml510dCSBErgebnisExportMapper extends Abstract510ErgebnisExportMapper {

  private static final long serialVersionUID = 1L;

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

  @Inject
  private transient CurrentCustomer currentCustomer;

  @Inject
  private transient GebietNummerFormatter gebietNummerFormatter;

  public Eml510dCSBErgebnisExportMapper() {
    super();
  }

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

  @Override
  protected String createSimpleFileName(ErgebnisExportObject exportObject, ErgebnisExportContext context) {
    Wahldurchfuehrung wahldurchfuehrung = exportObject.getErgebnisDaten().getWahl();

    if (isWahlartNational(wahldurchfuehrung)) { // ELECTVAPP-991
      String simpleFileName = "";
      simpleFileName += getMessage(exportsTotaaltelling() ? "eml.total.telling.prefix" : "eml.telling.prefix");
      simpleFileName += "_";
      simpleFileName += wahldurchfuehrung.getKennzeichen();

      return FileUtil.normalizeFileNamePreserveCase(simpleFileName);
    }

    return super.createSimpleFileName(exportObject, context);
  }

  private boolean isWahlartNational(Wahldurchfuehrung wahldurchfuehrung) {
    return EnumSet.of(NlWahlart.EERSTE_KAMER, NlWahlart.TWEEDE_KAMER, NlWahlart.EUROPEES_PARLEMENT, NlWahlart.REFERENDUM)
        .contains(NlWahlart.valueOf(wahldurchfuehrung));
  }

  @Override
  protected boolean isUseShortCodeForCandidateId(Wahl wahl) {
    return NlWahlart.valueOf(wahl).isUseShortCodeForCandidateIdIn510dUnd520(); // ELECT-13754
  }

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

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

  @Override
  protected String getAuthorityIdPrefix(ErgebnisExportObject exportObject) {
    if (!NlWahlart.isWasPSB(exportObject.getErgebnisDaten().getWahl(), currentCustomer.getCustomer())) {
      return "CSB"; // eine 510d für GR enthält nicht (!) CSB
    }

    return "";
  }

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

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

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

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

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

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

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

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

  @Override
  protected boolean exportsTotaaltelling() {
    return true; // ELECTVAPP-585
  }

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

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

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

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

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

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

  @Override
  public boolean isSignEml(Wahl wahl) {
    return false; // nicht notwendig siehe https://support.elect-it.com/wiki/display/VAPP/EML-Import+validation
  }

  @Override
  protected void fillReportingUnit(Wahldurchfuehrungsgebiet reportingUnitGebiet, ReportingUnitVotesWrapper reportingUnitVotesWrapper) {
    super.fillReportingUnit(reportingUnitGebiet, reportingUnitVotesWrapper);

    NlWahlart nlWahlart = NlWahlart.valueOf(reportingUnitGebiet.getWahl());
    String eml510dIdMessageKey = nlWahlart.getEml510dIdMessageKey();

    if (isBlank(eml510dIdMessageKey)) {
      reportingUnitVotesWrapper.setId(gebietNummerFormatter.getNummer(reportingUnitGebiet)); // ELECT-13644
    } else {
      reportingUnitVotesWrapper.setId(getMessage(eml510dIdMessageKey, reportingUnitGebiet.getNummer(),
          nlGebietDarstellungNummerFormatter.formatiereNummer(reportingUnitGebiet.getUebergeordnetesGebiet())));
    }

    String eml510dNameMessageKey = nlWahlart.getEml510dNameMessageKey();

    if (isBlank(eml510dNameMessageKey)) {
      reportingUnitVotesWrapper.setName(reportingUnitGebiet.getName()); // ELECT-13644
    } else {
      reportingUnitVotesWrapper.setName(
          getMessage(eml510dNameMessageKey, reportingUnitGebiet.getName(), reportingUnitGebiet.getAnschrift().getPlz())); // ELECTVAPP-1348
    }
  }

  @Override
  protected boolean isEml510ReportingUnitsAusgeben(Wahl wahl) {
    return NlWahlart.valueOf(wahl).isEml510dReportingUnitsAusgeben();
  }
}
