
package de.ivu.elect.was.exchange.wahl;

import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.function.Supplier;

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

import de.ivu.elect.business.gebietsbaum.boundary.NlGebietDarstellungNummerFormatter;
import de.ivu.elect.business.gebietsbaum.entity.Gebiet;
import de.ivu.elect.business.wahl.entity.NlWahlart;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.nl.eml.readable.AbstractEmlElectionWrapper;
import de.ivu.wahl.wus.oasis.eml.ElectionIdentifierStructure;
import de.ivu.wahl.wus.oasis.eml.kiesraad.ObjectFactory;

public class EmlCommonMapper implements Serializable {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient NlWahlartEmlMapper nlWahlartEmlMapper;

  @Inject
  private transient NlGebietDarstellungNummerFormatter nlGebietDarstellungNummerFormatter;

  public EmlCommonMapper() {
    super();
  }

  public void mappeWahldaten(Wahl wahl, AbstractEmlElectionWrapper emlElectionWrapper, @Nullable Gebiet gebiet, @Nullable Supplier<List<Gebiet>> alleGebiete) {
    ElectionIdentifierStructure electionIdentifierStructure = emlElectionWrapper.getElectionIdentifierStructure();
    electionIdentifierStructure.setElectionName(wahl.getName());
    electionIdentifierStructure.setId(wahl.getKennzeichen());
    electionIdentifierStructure.setElectionCategory(nlWahlartEmlMapper.bestimmeElectionCategory(wahl.getWahlart()).name());
    // ELECTVAPP-399 ELECTVAPP-1115
    emlElectionWrapper.addElectionSubcategory(nlWahlartEmlMapper.bestimmeElectionSubcategory(wahl.getWahlart(), gebiet, alleGebiete));
    if (gebiet != null) {
      // ELECTVAPP-399
      if (gebiet.isWahlgebiet()) {
        emlElectionWrapper.addElectionDomain(nlGebietDarstellungNummerFormatter.formatiereNummer(gebiet), gebiet.getName());
      }
    }

    // ELECTVAPP-277
    emlElectionWrapper.addElectionDate(wahl.getWahldatum());

  }
}
