
package de.ivu.elect.presentation.stimmzettel;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

import de.ivu.elect.business.kandidatur.control.StimmzettelFormatter;
import de.ivu.elect.business.stimmzettel.entity.StimmzettelDaten;
import de.ivu.elect.business.wahlvorschlag.entity.Liste;
import de.ivu.elect.jee.faces.Messages;
import de.ivu.elect.stimmzettel.StimmzettelBarcodes;
import de.ivu.elect.stimmzettel.StimmzettelFunctions;
import de.ivu.elect.stimmzettel.StimmzettelKandidat;
import de.ivu.elect.stimmzettel.StimmzettelKonfiguration;
import de.ivu.elect.stimmzettel.StimmzettelLokalisierung;
import de.ivu.elect.stimmzettel.StimmzettelTagGenerator;
import de.ivu.elect.stimmzettel.StimmzettelWahlvorschlag;
import de.ivu.elect.stimmzettel.ergebnis.StimmzettelStyle;


import static de.ivu.elect.presentation.stimmzettel.StimmzettelEditView.MAX_ANZAHL_MARKIERUNG_KANDIDAT;

public interface StimmzettelTagStore {

  String FORM_ID = "stimmzettelForm";

  String FORM_STYLE_CLASS = "stimmzettel-form";

  String INPUT_FIELD_ID = "stimmzettel-daten-input";

  String getStimmzettelTag();

  default String createStimmzettelTagInternal() {
    StimmzettelTagGenerator stimmzettelTagGenerator = new StimmzettelTagGenerator();
    List<StimmzettelWahlvorschlag> wahlvorschlaege = new ArrayList<>();

    StimmzettelDaten stimmzettelDaten = getStimmzettelDaten();

    for (Liste liste : stimmzettelDaten.getListen()) {
      List<StimmzettelKandidat> kandidaten = stimmzettelDaten.getListenkandidaturen(liste).stream()
          .map(listenkandidatur -> new StimmzettelKandidat(stimmzettelDaten.getListenkandidaturKennzahlFormatted(listenkandidatur), stimmzettelDaten.getListenkandidaturName(listenkandidatur),
              listenkandidatur.getAnzahlNennungen()))
          .collect(Collectors.toList());

      StimmzettelWahlvorschlag stimmzettelWahlvorschlag = new StimmzettelWahlvorschlag(stimmzettelDaten.getListeKennzahlFormatted(liste), liste.getKurzname(), liste.getKennwort(), kandidaten);

      wahlvorschlaege.add(stimmzettelWahlvorschlag);
    }

    StimmzettelKonfiguration konfiguration = new StimmzettelKonfiguration(stimmzettelDaten.getAnzahlStimmenProWaehlerMaximal(),
        stimmzettelDaten.getAnzahlStimmenProWaehlerProListenkandidaturMaximal(),
        MAX_ANZAHL_MARKIERUNG_KANDIDAT, true, true, false, false, isResetButtonEinblenden(), getFormId() + ":" + getInputFieldId(),
        new StimmzettelFunctions(getSaveFunctionName(),
            getSaveGueltigFunctionName(), getSaveUngueltigFunctionName(), getAbbrechenFunctionName()),
        getMessages().getMessageForMessageKey("stimmzettel.eingabe.code.speichern"),
        getMessages().getMessageForMessageKey("stimmzettel.eingabe.code.speichern.gueltig"),
        getMessages().getMessageForMessageKey("stimmzettel.eingabe.code.speichern.ungueltig"),
        new StimmzettelBarcodes(
            getMessages().getMessageForMessageKey("stimmzettel.barcode.code.loeschen"),
            getMessages().getMessageForMessageKey("stimmzettel.barcode.code.streichen"),
            getMessages().getMessageForMessageKey("stimmzettel.barcode.code.entstreichen"),
            getMessages().getMessageForMessageKey("stimmzettel.barcode.code.streichmodus"),
            getMessages().getMessageForMessageKey("stimmzettel.barcode.code.speichern"),
            getMessages().getMessageForMessageKey("stimmzettel.barcode.code.speichern.gueltig"),
            getMessages().getMessageForMessageKey("stimmzettel.barcode.code.speichern.ungueltig"),
            getMessages().getMessageForMessageKey("stimmzettel.barcode.code.resetall"),
            getMessages().getMessageForMessageKey("stimmzettel.barcode.code.abbrechen"),
            getMessages().getMessageForMessageKey("stimmzettel.barcode.code.einstimmen"),
            getMessages().getMessageForMessageKey("stimmzettel.barcode.code.zweistimmen"),
            getMessages().getMessageForMessageKey("stimmzettel.barcode.code.dreistimmen")

        ),
        StimmzettelStyle.OHNE_STYLE);

    return stimmzettelTagGenerator.generateTag(wahlvorschlaege, konfiguration, new StimmzettelLokalisierung());
  }

  boolean isResetButtonEinblenden();

  String getSaveFunctionName();

  String getSaveGueltigFunctionName();

  String getSaveUngueltigFunctionName();

  String getAbbrechenFunctionName();

  StimmzettelFormatter getStimmzettelFormatter();

  StimmzettelDaten getStimmzettelDaten();

  String getErfassteDatenAsString();

  void setErfassteDatenAsString(String stimmzettelDatenAsString);

  String getInputFieldId();

  String getFormId();

  Messages getMessages();
}
