/**
 * 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_CATALOG_CATALOG_ATTRIBUTE_HPP_
#define QUICKSTEP_CATALOG_CATALOG_ATTRIBUTE_HPP_

#include <string>

#include "catalog/Catalog.pb.h"
#include "catalog/CatalogTypedefs.hpp"
#include "utility/Macros.hpp"

namespace quickstep {

class CatalogRelationSchema;
class Type;

/** \addtogroup Catalog
 *  @{
 */

/**
 * @brief An attribute in a relation.
 **/
class CatalogAttribute {
 public:
  /**
   * @brief Create a new attribute.
   *
   * @param parent The relation this attribute belongs to.
   * @param name This attribute's name.
   * @param type This attribute's complete data type.
   * @param id This attribute's ID (defaults to -1, which means invalid/unset).
   * @param display_name A different name to display when printing values of
   *        this attribute out. Defaults to name.
   **/
  CatalogAttribute(CatalogRelationSchema *parent,
                   const std::string &name,
                   const Type &type,
                   const attribute_id id = -1,
                   const std::string &display_name = "")
      : parent_(parent), id_(id), name_(name), display_name_(display_name), type_(&type) {
  }

  /**
   * @brief Reconstruct an attribute from its serialized Protocol Buffer form.
   *
   * @param proto The Protocol Buffer serialization of an attribute,
   *        previously produced by getProto().
   **/
  explicit CatalogAttribute(const serialization::CatalogAttribute &proto);

  /**
   * @brief Get the parent relation.
   *
   * @return Parent relation.
   **/
  const CatalogRelationSchema& getParent() const {
    return *parent_;
  }

  /**
   * @brief Get a mutable pointer to the parent relation.
   *
   * @return Parent relation.
   **/
  CatalogRelationSchema* getParentMutable() {
    return parent_;
  }

  /**
   * @brief Get this attribute's ID.
   *
   * @return This attribute's ID.
   **/
  attribute_id getID() const {
    return id_;
  }

  /**
   * @brief Get this attribute's name.
   *
   * @return This attribute's name.
   **/
  const std::string& getName() const {
    return name_;
  }

  /**
   * @brief Get this attribute's display name (the name which would be printed
   *        to the screen).
   *
   * @return This attribute's display name.
   **/
  const std::string& getDisplayName() const {
    if (display_name_.empty()) {
      return name_;
    } else {
      return display_name_;
    }
  }

  /**
   * @brief Set this attribute's display name (the name which would be printed
   *        to the screen).
   */
  void setDisplayName(const std::string &new_display_name) {
    display_name_ = new_display_name;
  }

  /**
   * @brief Get this attribute's type.
   *
   * @return This attribute's type.
   **/
  const Type& getType() const {
    return *type_;
  }

  /**
   * @brief Serialize the attribute as Protocol Buffer.
   *
   * @return The Protocol Buffer representation of the attribute.
   **/
  serialization::CatalogAttribute getProto() const;

  /**
   * @brief Check whether a serialization::CatalogAttribute is fully-formed and
   *        all parts are valid.
   *
   * @param proto A serialized Protocol Buffer representation of a CatalogAttribute,
   *        originally generated by getProto().
   * @return Whether proto is fully-formed and valid.
   **/
  static bool ProtoIsValid(const serialization::CatalogAttribute &proto);

 private:
    /**
   * @brief Set the parent CatalogRelationSchema for this attribute. Used by
   *        CatalogRelationSchema (a friend of this class) when adding a new
   *        attribute.
   *
   * @param parent The new parent for this CatalogAttribute.
   **/
  void setParent(CatalogRelationSchema *parent) {
    parent_ = parent;
  }

  /**
   * @brief Set the ID of this attribute. Used by CatalogRelationSchema (a
   *        friend of this class) when adding a new attribute.
   *
   * @param id The new ID for this CatalogAttribute.
   **/
  void setID(const attribute_id id) {
    id_ = id;
  }

  CatalogRelationSchema *parent_;

  // The attribute id in CatalogRelationSchema.
  attribute_id id_;

  // The internal attribute name.
  const std::string name_;

  // The external attribute name used to print on screen, if non-empty.
  std::string display_name_;

  // The attribute's underlying type.
  const Type *type_;

  friend class CatalogRelationSchema;

  DISALLOW_COPY_AND_ASSIGN(CatalogAttribute);
};

/** @} */

}  // namespace quickstep

#endif  // QUICKSTEP_CATALOG_CATALOG_ATTRIBUTE_HPP_
