package org.adroitlogic.ultraesb.terminal.commands;
import org.adroitlogic.ultraesb.jmx.JMXConstants;
import org.adroitlogic.ultraesb.jmx.core.EndpointManagementMXBean;
import org.adroitlogic.ultraesb.jmx.core.SequenceManagementMXBean;
import org.adroitlogic.ultraesb.jmx.view.EndpointView;
import org.adroitlogic.ultraesb.jmx.view.SequenceView;
import org.adroitlogic.ultraesb.terminal.TerminalException;
import org.adroitlogic.ultraesb.terminal.annotations.CommandOption;
import org.adroitlogic.ultraesb.terminal.annotations.TerminalCommand;
import java.util.ArrayList;
import java.util.List;
public class SearchCommand extends CommandsBase {
  @TerminalCommand(
      name = "search-endpoints",
      alias = "sep",
      description = "search the endpoints with id containing the given string")
  public List<String> searchEndpoints(String contains,
    @CommandOption(
        shortForm = "s",
        longForm = "case-sensitive",
        description = "search the term case sensitively") boolean caseSensitive) throws TerminalException {
    if (contains == null) {
      throw new TerminalException("Search string cannot be null");
    }
    List<String> searchResults = new ArrayList<String>();
    for (EndpointView endpoint : getMXBeanProxy(JMXConstants.MXBEAN_NAME_ENDPOINTS,
          EndpointManagementMXBean.class).getEndpoints()) {
      if (contains(endpoint.getId(), contains, caseSensitive)) {
        searchResults.add(endpoint.getId());
      }
    }
    return searchResults;
  }
  @TerminalCommand(
      name = "search-sequences",
      alias = "ssq",
      description = "search the sequences with id containing the given string")
  public List<String> searchSequences(String contains,
    @CommandOption(
        shortForm = "s",
        longForm = "case-sensitive",
        description = "search the term case sensitively") boolean caseSensitive) throws TerminalException {
    if (contains == null) {
      throw new TerminalException("Search string cannot be null");
    }
    List<String> searchResults = new ArrayList<String>();
    for (SequenceView endpoint : getMXBeanProxy(JMXConstants.MXBEAN_NAME_ENDPOINTS,
          SequenceManagementMXBean.class).getSequences()) {
      if (contains(endpoint.getId(), contains, caseSensitive)) {
        searchResults.add(endpoint.getId());
      }
    }
    return searchResults;
  }
  private boolean contains(String id, String contains, boolean caseSensitive) {
    if (!caseSensitive) {
      id = id.toUpperCase();
      contains = contains.toUpperCase();
    }
    return id.indexOf(contains) != -1;
  }
}