
package de.ivu.elect.presentation.wahlbeteiligung.form;

import static org.apache.commons.lang3.time.DateUtils.isSameDay;

import java.util.Date;
import java.util.List;
import java.util.Map;

import javax.inject.Inject;

import de.ivu.elect.business.gebietsbaum.entity.Wahldurchfuehrungsgebiet;
import de.ivu.elect.business.wahl.entity.Wahl;
import de.ivu.elect.business.wahlbeteiligung.entity.Wahlbeteiligung;
import de.ivu.elect.business.wahlbeteiligung.entity.WahlbeteiligungAuswertung;
import de.ivu.elect.business.wahlbeteiligung.entity.WahlbeteiligungAuswertungStatus;
import de.ivu.elect.business.wahlbeteiligung.entity.WahlbeteiligungAuswertungTyp;
import de.ivu.elect.business.wahlbeteiligung.entity.WahlbeteiligungProperties;
import de.ivu.elect.jee.presentation.dynamicform.FormBuilder;
import de.ivu.elect.presentation.ViewFormBuilder;
import de.ivu.elect.presentation.gebietsbaum.form.AnzahlWahlberechtigteViewFormBuilder;
import de.ivu.elect.presentation.replikation.ReplikationPresentationStatus;
import de.ivu.elect.presentation.security.GebietSecurity;

public class WahlbeteiligungViewFormBuilder extends ViewFormBuilder {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient GebietSecurity gebietSecurity;

  @Inject
  private transient ReplikationPresentationStatus replikationPresentationStatus;

  @Inject
  private transient AnzahlWahlberechtigteViewFormBuilder anzahlWahlberechtigteViewFormBuilder;

  public WahlbeteiligungViewFormBuilder() {
    super();
  }

  public void addProperties(FormBuilder formBuilder, Wahldurchfuehrungsgebiet wahldurchfuehrungsgebiet, List<WahlbeteiligungAuswertung> wahlbeteiligungAuswertungen,
      Map<WahlbeteiligungAuswertung, Wahlbeteiligung> wahlbeteiligungProAuswertung) {
    // soll auch ohne A-Werte gehen boolean wahlberechtigteVorhanden = wahldurchfuehrungsgebiet.hasAnzahlWahlberechtigteOhneWahlschein();
    boolean hasPermission = gebietSecurity.getBearbeitenGebietSecurity().isRechtVorhanden(wahldurchfuehrungsgebiet);
    boolean isSlave = replikationPresentationStatus.isSlave();

    anzahlWahlberechtigteViewFormBuilder.addAnzahlWahlberechtigteProperties(formBuilder, wahldurchfuehrungsgebiet, true);

    Wahl wahl = wahldurchfuehrungsgebiet.getWahl();
    Date wahldatum = wahl.getWahldatum();

    for (WahlbeteiligungAuswertung wahlbeteiligungAuswertung : wahlbeteiligungAuswertungen) {
      Date wahlbeteiligungAuswertungDatum = wahlbeteiligungAuswertung.getDatum();
      WahlbeteiligungAuswertungTyp wahlbeteiligungAuswertungTyp = wahlbeteiligungAuswertung.getTyp();
      WahlbeteiligungAuswertungStatus wahlbeteiligungAuswertungStatus = wahlbeteiligungAuswertung.getStatus();

      Wahlbeteiligung wahlbeteiligung = wahlbeteiligungProAuswertung.get(wahlbeteiligungAuswertung);

      String statusTypInfo = "";

      if (!wahlbeteiligungAuswertungTyp.isManuelleErfassungMoeglich()) {
        statusTypInfo += getMessage(wahlbeteiligungAuswertungTyp);
      }

      if (!wahlbeteiligungAuswertungStatus.isManuelleErfassungMoeglich()) {
        if (statusTypInfo.length() > 0) {
          statusTypInfo += ", ";
        }

        statusTypInfo += getMessage(wahlbeteiligungAuswertungStatus);
      }

      if (statusTypInfo.length() > 0) {
        statusTypInfo = " (" + statusTypInfo + ")";
      }

      String wahlbeteiligungAuswertungUhrzeitFormatted = getUserLocale().formatTimeHHmm(wahlbeteiligungAuswertungDatum);

      if (isSameDay(wahlbeteiligungAuswertungDatum, wahldatum)) {
        formBuilder.addSeparator("wahlbeteiligung.separator.auswertung.nur.uhrzeit", wahlbeteiligungAuswertungUhrzeitFormatted, statusTypInfo);
      } else {
        formBuilder.addSeparator("wahlbeteiligung.separator.auswertung", getUserLocale().formatDate(wahlbeteiligungAuswertungDatum), wahlbeteiligungAuswertungUhrzeitFormatted, statusTypInfo);
      }

      WahlbeteiligungProperties wahlbeteiligungProperties = wahlbeteiligung.getProperties();

      formBuilder.addProperty(wahlbeteiligungProperties.getAnzahlWaehlerGesamtProperty()) //
          .withRequired(false) //
          .withValidator(new WahlbeteiligungAnzahlWaehlerGesamtFacesValidator(getMessages(), wahl, wahldurchfuehrungsgebiet.getAnzahlWahlberechtigterGesamtA1A2A3())) //
          .withReadonly(/* soll auch ohne A-Werte gehen !wahlberechtigteVorhanden || */
              !hasPermission || isSlave || !wahlbeteiligungAuswertungStatus.isManuelleErfassungMoeglich() || !wahlbeteiligungAuswertungTyp.isManuelleErfassungMoeglich());
    }
  }
}
