package com.jetbrains.python.debugger.pydev;

import com.google.common.collect.Lists;
import com.jetbrains.python.console.pydev.PydevCompletionVariant;
import com.jetbrains.python.debugger.PyDebuggerException;
import com.jetbrains.python.debugger.PydevXmlUtils;
import org.jetbrains.annotations.NotNull;

import java.util.List;

/**
 * @author traff
 */
public class GetCompletionsCommand extends AbstractFrameCommand {

  private String myActionToken;
  private List<PydevCompletionVariant> myCompletions = null;

  public GetCompletionsCommand(final RemoteDebugger debugger,
                               String threadId,
                               String frameId,
                               final String myActionToken) {
    super(debugger, GET_COMPLETIONS, threadId, frameId);
    this.myActionToken = myActionToken;
  }


  @Override
  public boolean isResponseExpected() {
    return true;
  }

  @Override
  protected void processResponse(ProtocolFrame response) throws PyDebuggerException {
    super.processResponse(response);
    try {
      myCompletions = PydevXmlUtils.xmlToCompletions(response.getPayload(), myActionToken);
    }
    catch (Exception e) {
      throw new PyDebuggerException("cant obtain completions", e);
    }
  }


  @Override
  protected void buildPayload(Payload payload) {
    super.buildPayload(payload);
    payload.add("FRAME").add(myActionToken);
  }

  @NotNull
  public List<PydevCompletionVariant> getCompletions() {
    if (myCompletions != null) {
      return myCompletions;
    }
    else {
      return Lists.newArrayList();
    }
  }
}
