/**
 * 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.
 **/

#ifndef QUICKSTEP_PARSER_PARSE_KEY_VALUE_HPP_
#define QUICKSTEP_PARSER_PARSE_KEY_VALUE_HPP_

#include <memory>
#include <string>
#include <vector>

#include "parser/ParseLiteralValue.hpp"
#include "parser/ParseString.hpp"
#include "parser/ParseTreeNode.hpp"
#include "utility/Macros.hpp"
#include "utility/PtrList.hpp"

namespace quickstep {

/**
 * @brief Base class for the Parse Key Values.
 */
class ParseKeyValue : public ParseTreeNode {
 public:
  enum KeyValueType {
    kStringBool = 0,
    kStringInteger,
    kStringString,
    kStringStringList
  };

  /**
   * @brief Constructor.
   *
   * @param line_number Line number of the first token of this node in the SQL statement.
   * @param column_number Column number of the first token of this node in the SQL statement.
   * @param value A single literal value.
   **/
  ParseKeyValue(const int line_number,
                const int column_number,
                ParseString *key)
      : ParseTreeNode(line_number, column_number),
        key_(key) { }

  /**
   * @brief Destructor.
   **/
  ~ParseKeyValue() override { }

  /**
   * @brief Get the subclass type of the parse key value.
   */
  virtual KeyValueType getKeyValueType() const = 0;

  /**
   * @return Pointer to the key string.
   */
  const ParseString* key() const {
    return key_.get();
  }

  std::string getName() const override {
    return "KeyValue";
  }

 protected:
  std::unique_ptr<ParseString> key_;
};

/**
 * @brief The parsed representation of a key-value pair.
 **/
class ParseKeyStringValue : public ParseKeyValue {
 public:
  /**
   * @brief Constructor.
   *
   * @param line_number Line number of the first token of this node in the SQL statement.
   * @param column_number Column number of the first token of this node in the SQL statement.
   * @param key A parse string representing the key.
   * @param value A parse string representing the key.
   **/
  ParseKeyStringValue(const int line_number,
                      const int column_number,
                      ParseString *key,
                      ParseString *value)
      : ParseKeyValue(line_number, column_number, key),
        value_(value) { }

  KeyValueType getKeyValueType() const override {
    return kStringString;
  }

  /**
   * @return A pointer to the value ParseString.
   */
  const ParseString* value() const {
    return value_.get();
  }

  std::string getName() const override {
    return "KeyStringValue";
  }

 protected:
  void getFieldStringItems(
      std::vector<std::string> *inline_field_names,
      std::vector<std::string> *inline_field_values,
      std::vector<std::string> *non_container_child_field_names,
      std::vector<const ParseTreeNode*> *non_container_child_fields,
      std::vector<std::string> *container_child_field_names,
      std::vector<std::vector<const ParseTreeNode*>> *container_child_fields) const override {
    inline_field_names->push_back("key");
    inline_field_values->push_back(key_->value());

    non_container_child_field_names->push_back("value");
    non_container_child_fields->push_back(value_.get());
  }

 private:
  std::unique_ptr<ParseString> value_;

  DISALLOW_COPY_AND_ASSIGN(ParseKeyStringValue);
};

/**
 * @brief The parsed representation of a key-value pair. Value is a list of values.
 **/
class ParseKeyStringList : public ParseKeyValue {
 public:
  /**
   * @brief Constructor.
   *
   * @param line_number Line number of the first token of this node in the SQL statement.
   * @param column_number Column number of the first token of this node in the SQL statement.
   * @param key A parse string representing the key.
   * @param value A list of string values.
   **/
  ParseKeyStringList(const int line_number,
                     const int column_number,
                     ParseString *key,
                     PtrList<ParseString> *value)
      : ParseKeyValue(line_number, column_number, key),
        value_(value) {}

  KeyValueType getKeyValueType() const override {
    return kStringStringList;
  }

  /**
   * @return A list of ParseStrings.
   */
  const PtrList<ParseString>* value() const {
    return value_.get();
  }

  std::string getName() const override {
    return "KeyStringList";
  }

 protected:
  void getFieldStringItems(
      std::vector<std::string> *inline_field_names,
      std::vector<std::string> *inline_field_values,
      std::vector<std::string> *non_container_child_field_names,
      std::vector<const ParseTreeNode*> *non_container_child_fields,
      std::vector<std::string> *container_child_field_names,
      std::vector<std::vector<const ParseTreeNode*>> *container_child_fields) const override {
    inline_field_names->push_back("key");
    inline_field_values->push_back(key_->value());

    container_child_field_names->push_back("value_list");
    container_child_fields->emplace_back();
    for (const ParseString &value : *value_) {
      container_child_fields->back().push_back(&value);
    }
  }

 private:
  std::unique_ptr<PtrList<ParseString> > value_;

  DISALLOW_COPY_AND_ASSIGN(ParseKeyStringList);
};

/**
 * @brief The parsed representation of a key-value pair. Value is of int type.
 **/
class ParseKeyIntegerValue : public ParseKeyValue {
 public:
  /**
   * @brief Constructor.
   *
   * @param line_number Line number of the first token of this node in the SQL statement.
   * @param column_number Column number of the first token of this node in the SQL statement.
   * @param key A parse string representing the key.
   * @param value A single numeric literal value.
   **/
  ParseKeyIntegerValue(const int line_number,
                       const int column_number,
                       ParseString *key,
                       NumericParseLiteralValue *value)
      : ParseKeyValue(line_number, column_number, key),
        value_(value) {}

  KeyValueType getKeyValueType() const override {
    return kStringInteger;
  }

  /**
   * @return A pointer to the value ParseString.
   */
  const NumericParseLiteralValue* value() const {
    return value_.get();
  }

  std::string getName() const override {
    return "KeyIntegerValue";
  }

 protected:
  void getFieldStringItems(
      std::vector<std::string> *inline_field_names,
      std::vector<std::string> *inline_field_values,
      std::vector<std::string> *non_container_child_field_names,
      std::vector<const ParseTreeNode*> *non_container_child_fields,
      std::vector<std::string> *container_child_field_names,
      std::vector<std::vector<const ParseTreeNode*>> *container_child_fields) const override {
    inline_field_names->push_back("key");
    inline_field_values->push_back(key_->value());

    non_container_child_field_names->push_back("value");
    non_container_child_fields->push_back(value_.get());
  }

 private:
  std::unique_ptr<NumericParseLiteralValue> value_;

  DISALLOW_COPY_AND_ASSIGN(ParseKeyIntegerValue);
};

/**
 * @brief The parsed representation of a key-value pair. Value is of bool type.
 **/
class ParseKeyBoolValue : public ParseKeyValue {
 public:
  /**
   * @brief Constructor.
   *
   * @param line_number Line number of the first token of this node in the SQL statement.
   * @param column_number Column number of the first token of this node in the SQL statement.
   * @param key A parse string representing the key.
   * @param value A single bool literal value.
   **/
  ParseKeyBoolValue(const int line_number,
                    const int column_number,
                    ParseString *key,
                    const bool value)
      : ParseKeyValue(line_number, column_number, key),
        value_(value) {}

  KeyValueType getKeyValueType() const override {
    return kStringBool;
  }

  /**
   * @return The bool value.
   */
  bool value() const {
    return value_;
  }

  std::string getName() const override {
    return "KeyBoolValue";
  }

 protected:
  void getFieldStringItems(
      std::vector<std::string> *inline_field_names,
      std::vector<std::string> *inline_field_values,
      std::vector<std::string> *non_container_child_field_names,
      std::vector<const ParseTreeNode*> *non_container_child_fields,
      std::vector<std::string> *container_child_field_names,
      std::vector<std::vector<const ParseTreeNode*>> *container_child_fields) const override {
    inline_field_names->push_back("key");
    inline_field_values->push_back(key_->value());

    inline_field_names->push_back("value");
    inline_field_values->push_back(value_ ? "true" : "false");
  }

 private:
  const bool value_;

  DISALLOW_COPY_AND_ASSIGN(ParseKeyBoolValue);
};

}  // namespace quickstep

#endif  // QUICKSTEP_PARSER_PARSE_KEY_VALUE_HPP_
