
package de.ivu.elect.exchange.benutzer;

import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import javax.inject.Inject;

import de.ivu.elect.business.benutzerverwaltung.boundary.BenutzerFactory;
import de.ivu.elect.business.benutzerverwaltung.entity.Rolle;

public abstract class AbstractDefaultBenutzerMapper<T extends DefaultBenutzer> implements BenutzerMapper {

  public static final String FILE_FORMAT_NAME = "file.format.benutzer.default";

  @Inject
  public transient BenutzerFactory benutzerFactory;

  public AbstractDefaultBenutzerMapper() {
    super();
  }

  protected abstract T createBenutzer();

  protected T mappeBenutzer(de.ivu.elect.business.benutzerverwaltung.entity.Benutzer from) {
    T to = createBenutzer();
    to.setBenutzerkennung(from.getBenutzerkennung());
    to.setPasswort(from.getPasswort());
    to.setSalt(from.getSalt());
    Boolean gesperrt = from.getGesperrt();
    boolean aktiv = true;
    if (gesperrt!=null){
      aktiv =!gesperrt;
    }
    to.setAktiv(aktiv);
    to.setBemerkung(from.getBemerkung());
    to.setFamilienname(from.getFamilienname());
    to.setVorname(from.getVorname());
    to.setGeschlecht(from.getGeschlecht());
    to.setMussPasswortWechseln(from.getMussPasswortWechseln());
    to.setRollen(convertToDefaultRollen(from.getRollenSortedByNameAsc()));
    return to;
  }

  protected de.ivu.elect.business.benutzerverwaltung.entity.Benutzer mappeBenutzer(T from) {
    de.ivu.elect.business.benutzerverwaltung.entity.Benutzer to = benutzerFactory.create();
    to.setBenutzerkennung(from.getBenutzerkennung());
    to.setPasswort(from.getPasswort());
    to.setSalt(from.getSalt());
    to.setGesperrt(!from.isAktiv());
    to.setBemerkung(from.getBemerkung());
    to.setFamilienname(from.getFamilienname());
    to.setVorname(from.getVorname());
    to.setGeschlecht(from.getGeschlecht());
    to.setMussPasswortWechseln(mapMussPasswortWechseln(from));
    setRollen(from, to);
    return to;
  }

  private Boolean mapMussPasswortWechseln(T from) {
    Boolean mussPasswortWechseln = from.getMussPasswortWechseln();
    if (mussPasswortWechseln == null) {
      return Boolean.FALSE;
    }
    return mussPasswortWechseln;
  }

  public static List<DefaultRolle> convertToDefaultRollen(Collection<Rolle> rolles) {
    List<DefaultRolle> defaultRollen = new ArrayList<>();
    for (Rolle rolle : rolles) {
      DefaultRolle defaultRolle = createRolle();
      defaultRolle.setName(rolle.getName());
      defaultRollen.add(defaultRolle);
    }
    return defaultRollen;
  }

  private void setRollen(T from, de.ivu.elect.business.benutzerverwaltung.entity.Benutzer to) {
    if (from.getRollen() != null) {
      Set<String> rollen = new HashSet<>();

      for (DefaultRolle rolle : from.getRollen()) {
        String name = rolle.getName();

        if (!rollen.contains(name)) {
          Rolle deserialiserteRolle = new Rolle();
          deserialiserteRolle.setName(name);
          to.addRolle(deserialiserteRolle);

          rollen.add(name);
        }
      }
    }
  }

  private static DefaultRolle createRolle() {
    return new DefaultRolle();
  }
}
