/*
 ** This file is part of the ViTE project.
 **
 ** This software is governed by the CeCILL-A license under French law
 ** and abiding by the rules of distribution of free software. You can
 ** use, modify and/or redistribute the software under the terms of the
 ** CeCILL-A license as circulated by CEA, CNRS and INRIA at the following
 ** URL: "http://www.cecill.info".
 **
 ** As a counterpart to the access to the source code and rights to copy,
 ** modify and redistribute granted by the license, users are provided
 ** only with a limited warranty and the software's author, the holder of
 ** the economic rights, and the successive licensors have only limited
 ** liability.
 **
 ** In this respect, the user's attention is drawn to the risks associated
 ** with loading, using, modifying and/or developing or reproducing the
 ** software by the user in light of its specific status of free software,
 ** that may mean that it is complicated to manipulate, and that also
 ** therefore means that it is reserved for developers and experienced
 ** professionals having in-depth computer knowledge. Users are therefore
 ** encouraged to load and test the software's suitability as regards
 ** their requirements in conditions enabling the security of their
 ** systems and/or data to be ensured and, more generally, to use and
 ** operate it in the same conditions as regards security.
 **
 ** The fact that you are presently reading this means that you have had
 ** knowledge of the CeCILL-A license and that you accept its terms.
 **
 **
 ** ViTE developers are (for version 0.* to 1.0):
 **
 **        - COULOMB Kevin
 **        - FAVERGE Mathieu
 **        - JAZEIX Johnny
 **        - LAGRASSE Olivier
 **        - MARCOUEILLE Jule
 **        - NOISETTE Pascal
 **        - REDONDY Arthur
 **        - VUCHENER Clément
 **
 */
#ifndef ENTITYTYPE_HPP
#define ENTITYTYPE_HPP

/*!
 * \file EntityType.hpp
 */
class EntityValue;
/*!
 * \class EntityType
 * \brief A abstract class that represent the various types of entities
 */
class EntityType {
private:
    EntityClass_t                        _class; /* Class of EntityType: State, Link, Event or Variable */
    Name                                 _name;
    ContainerType                       *_container_type;
    std::map<std::string, EntityValue* > _values;
    std::map<std::string, Value *>*      _extra_fields;

protected:

    /*!
     * \fn EntityType(Name name, ContainerType *container_type, std::map<std::string, Value *> opt)
     * \brief Default constructor
     * \param name Name of the entity type
     * \param container_type The type of container
     * \param opt Optional fields
     */
    EntityType(EntityClass_t ec, Name name, ContainerType *container_type, std::map<std::string, Value *>& opt);

public:
    //EntityType();

    /*
     * \fn EntityType
     * \brief Destructor
     */
    virtual ~EntityType();

    /*!
     * \fn add_value(EntityValue *value)
     * \brief Add a value for this type of entity
     */
    void add_value(EntityValue *value);

    /*!
     * \fn get_name() const
     * \brief Get the name of the entity type
     */
    const Name get_Name() const;
    const std::string get_name() const;
    const std::string get_alias() const;

    EntityClass_t get_class() const;

    /*!
     * \fn get_container_type() const
     * \brief Get the type of the container
     */
    const ContainerType *get_container_type() const;

    /*!
     * \fn get_values() const
     * \brief Get the list of the values
     */
    const std::map<std::string, EntityValue* > *get_values() const;

    /*!
     * \fn get_extra_fields() const
     * \brief Get the extra fields
     */
    std::map<std::string, Value *> *get_extra_fields() const;

    void set_name(Name name);
    void set_container_type(ContainerType* container_type);
    void set_extra_fields(std::map<std::string, Value*> *extra_fields);
    void set_values(std::map<std::string, EntityValue*> values);
};

#endif
