/**
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 **/

#include "cli/LineReaderLineNoise.hpp"

#include <algorithm>
#include <cctype>
#include <cstdlib>
#include <string>
#include <utility>

#include "third_party/linenoise/linenoise.h"

namespace quickstep {

LineReaderLineNoise::LineReaderLineNoise(const std::string &default_prompt,
                                         const std::string &continue_prompt)
    : LineReader(default_prompt, continue_prompt) {
}

std::string LineReaderLineNoise::getLineInternal(const bool continuing) {
  const char *prompt;
  if (continuing) {
    prompt = continue_prompt_.c_str();
  } else {
    prompt = default_prompt_.c_str();
  }
  char *input_line;

  if ((input_line = linenoise(prompt)) != nullptr) {
    std::string retval(input_line);
    if (continuing
        || !std::all_of(retval.begin(), retval.end(), ::isspace)) {
      // Don't add a blank line that's not part of a command to history.
      linenoiseHistoryAdd(input_line);
    }
    std::free(input_line);
    return retval;
  } else {
    return std::string("");
  }
}

}  // namespace quickstep
