package de.ivu.elect.business.system.control.status;

import java.lang.management.ManagementFactory;
import java.lang.management.RuntimeMXBean;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

import javax.inject.Inject;

import de.ivu.elect.business.mandant.entity.Mandant;
import de.ivu.elect.business.system.control.SystemRequirements;
import de.ivu.elect.business.system.entity.SystemStatusOptionGroup;
import de.ivu.elect.jee.presentation.status.StatusEntry;
import de.ivu.elect.jee.presentation.status.StatusOptionType;

/**
 *  on 26.05.2017.
 */
public class JvmStartparameterSystemStatusOptionResolver extends AbstractSystemStatusOptionResolver {

  private static final StatusOptionType START_PARAMETER = new StatusOptionType() {
    @Override
    public String toString() {
      return "START_PARAMETER";
    }
  };

  private static final StatusOptionType START_PARAMETER_DUERFEN_NICHT_GESETZT_SEIN = new StatusOptionType() {
    @Override
    public String toString() {
      return "START_PARAMETER_DUERFEN_NICHT_GESETZT_SEIN";
    }
  };

  @Inject
  private transient SystemRequirements systemRequirements;

  @Override
  protected StatusEntry resolveSystemStatusOption(SystemStatusOption statusOption) {
    if (START_PARAMETER.equals(statusOption.getType())) {
      String parameter = (String) statusOption.getPayload();
      if (isParameterVorhanden(parameter)) {
        return ok("system.info.konfiguriert.parameter.ok", parameter);
      }
      return warn("system.info.konfiguriert.parameter.nok", parameter);
    }

    if (START_PARAMETER_DUERFEN_NICHT_GESETZT_SEIN.equals(statusOption.getType())) {
      String parameter = (String) statusOption.getPayload();
      if (isParameterVorhanden(parameter)) {
        return error("system.info.konfiguriert.parameter.darf.nicht.nok", parameter);
      }
      return ok("system.info.konfiguriert.parameter.darf.nicht.ok", parameter);
    }

    throw new RuntimeException("Unbekannter Typ: " + statusOption.getType());
  }

  @Override
  protected boolean isAccept(Mandant mandant) {
    return mandant.getArt().isSystemMandant();
  }

  @Override
  protected List<SystemStatusOption> getStatusOptionsInternal(Mandant mandant) {
    List<SystemStatusOption> result = new ArrayList<>();
    result.addAll(systemRequirements.getStartParameters().stream().map(p -> new SystemStatusOption(START_PARAMETER, p, mandant)).collect(Collectors.toList()));
    result.addAll(
        systemRequirements.getStartParametersDuerfenNichtGesetztSein().stream().map(p -> new SystemStatusOption(START_PARAMETER_DUERFEN_NICHT_GESETZT_SEIN, p, mandant))
            .collect(Collectors.toList()));

    return result;

  }

  private boolean isParameterVorhanden(String parameter) {
    String parameterNormalized = parameter.trim().toLowerCase();
    RuntimeMXBean runtimeMxBean = ManagementFactory.getRuntimeMXBean();
    return runtimeMxBean.getInputArguments().stream().map(s -> s.trim().toLowerCase()).anyMatch(parameterNormalized::equals);
  }

  @Override
  public SystemStatusOptionGroup getSystemStatusOptionGroup() {
    return SystemStatusOptionGroup.JVM_START_OPTIONEN;
  }

}
