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

import java.util.Collections;
import java.util.List;

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

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.WahldurchfuehrungsgebietDAO;
import de.ivu.elect.business.gebietsbaum.entity.GebietPK;
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.was.exchange.stimmeingabe.Eml510;

public class Eml510bHSBErgebnisExportMapper extends Abstract510ErgebnisExportMapper {

  private static final long serialVersionUID = 1L;

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

  @Inject
  private transient WahldurchfuehrungsgebietDAO wahldurchfuehrungsgebietDAO;

  public Eml510bHSBErgebnisExportMapper() {
    super();
  }

  @Override
  protected boolean isWahlebenePassend(Wahl wahl) {
    if (NlWahlart.PROVINCIALE_STATEN1.equalsWahlart(wahl) && isHSB(wahl)) {
      return true; // ELECTVAPP-1750
    }

    if (NlWahlart.WATERSCHAP.equalsWahlart(wahl) && isHSB(wahl)) {
      return true; // ELECTVAPP-1750
    }

    return super.isWahlebenePassend(wahl) && !isGSB(wahl);
  }

  @Override
  protected String getEmlId() {
    return Eml510.EML510b.getId();
  }

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

  @Override
  public boolean isSignEml(Wahl wahl) {
    return !isCSB(wahl); // ELECTVAPP-718, siehe auch https://support.elect-it.com/wiki/display/VAPP/EML-Import+validation...
  }

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

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

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

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

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

  @Override
  protected boolean isErgebnisNotwendig() {
    return false; // jederzeit möglich
  }

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

  @Nullable
  @Override
  protected Wahldurchfuehrungsgebiet bestimmeTotalVotesGebiet(ErgebnisExportObject ergebnisExportObject, ErgebnisExportContext context) {
    GebietPK gebietPK = getAusgewaehltesGebietPK(context);

    if (gebietPK == null) {
      return null;
    }
    return wahldurchfuehrungsgebietDAO.findByPrimaryKey(gebietPK);
  }

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

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

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

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

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

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

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

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