package de.ivu.elect.business.personenregister.boundary;

import java.util.HashSet;
import java.util.Set;

import javax.annotation.Nullable;
import javax.enterprise.context.RequestScoped;
import javax.enterprise.inject.Instance;
import javax.inject.Inject;

import de.ivu.elect.business.konfiguration.entity.KonfigurationLoader;
import de.ivu.elect.business.konfiguration.entity.MandantKonfigurationWerte;
import de.ivu.elect.business.mandant.entity.Mandant;
import de.ivu.elect.business.personenregister.control.NoOpPersonenregister;
import de.ivu.elect.business.personenregister.entity.PersonenregisterSource;

@RequestScoped
public class PersonenregisterSwitch {

  @Inject
  private transient Instance<PersonenregisterResolver> personenregisterResolvers;

  @Inject
  private transient KonfigurationLoader konfigurationLoader;

  public boolean isPersonenregisterAvailable(Mandant mandant) {
    PersonenregisterResolver resolver = getPersonenregisterResolver(mandant);
    return resolver != null && resolver.isPersonenregisterAvailable(mandant);
  }

  public Personenregister<?> getPersonenregister(Mandant mandant) {
    PersonenregisterResolver resolver = getPersonenregisterResolver(mandant);

    if (resolver != null) {
      return resolver.getPersonenregister();
    }

    return NoOpPersonenregister.INSTANCE;
  }

  @Nullable
  public PersonenregisterResolver getPersonenregisterResolver(Mandant mandant) {
    PersonenregisterSource source = konfigurationLoader
        .resolveEnumValue(mandant, MandantKonfigurationWerte.PERSONENREGISTER_SOURCE, PersonenregisterSource.class);

    if (source==null){
      return null;
    }
    for (PersonenregisterResolver personenregisterResolver : personenregisterResolvers) {
      if (source.equals(personenregisterResolver.getPersonenregisterSource())) {
        return personenregisterResolver;
      }
    }

    return null;
  }

  public Set<PersonenregisterSource> getPersonenregisterSources(){
    Set<PersonenregisterSource> result = new HashSet<>();
    for (PersonenregisterResolver personenregisterResolver : personenregisterResolvers) {
      result.add(personenregisterResolver.getPersonenregisterSource());
    }
    return result;
  }
}
