
package de.ivu.elect.presentation.personenpruefung;

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

import javax.inject.Inject;

import de.ivu.elect.business.person.entity.Personendaten;
import de.ivu.elect.business.personenpruefung.control.PersonenPruefSchritt;
import de.ivu.elect.business.personenpruefung.control.wahlrecht.AbstractPersonenWahlrechtPruefSchritt;
import de.ivu.elect.jee.faces.Messages;

public class PersonenPruefSchrittFormatter implements Serializable {

  private static final long serialVersionUID = 1L;

  @Inject
  private transient Messages messages;

  @Inject
  private transient PersonendatenWahlrechtKriteriumFormatter personendatenWahlrechtKriteriumFormatter;

  public PersonenPruefSchrittFormatter() {
    super();
  }

  public List<PersonenPruefSchrittFormatted> formatPersonenPruefSchritteFailed(Personendaten personendaten, List<PersonenPruefSchritt> personenPruefSchritte) {
    return personenPruefSchritte.stream().map(personenPruefSchritt -> formatPersonenPruefSchrittFailed(personendaten, personenPruefSchritt)).collect(Collectors.toList());
  }

  public PersonenPruefSchrittFormatted formatPersonenPruefSchrittFailed(Personendaten personendaten, PersonenPruefSchritt personenPruefSchritt) {
    List<String> details = new ArrayList<>();

    if (personenPruefSchritt instanceof AbstractPersonenWahlrechtPruefSchritt) {
      personendatenWahlrechtKriteriumFormatter.formatKriterienFailed(((AbstractPersonenWahlrechtPruefSchritt) personenPruefSchritt).getMatcher(personendaten), personendaten)
          .forEach(kriteriumFormatted -> details.add(kriteriumFormatted.getDescription()));
    }

    return new PersonenPruefSchrittFormatted(getMessage("PersonenPruefSchritt.label." + personenPruefSchritt.getPersonenKonfliktArt().name()), details);
  }

  private String getMessage(String msgKey, Object... params) {
    return getMessages().getMessageForMessageKey(msgKey, params);
  }

  private Messages getMessages() {
    return messages;
  }
}
