using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Graphs
{
    /// <summary>
    /// Permet d'attribuer des valeurs à un noeud ou à un arc. Cette classe doit être héritée par l'utilisateur de la librairie pour la spécifier et ainsi l'utiliser dans son étude. Il est important que tous les Node aient le même type de Label, idem pour les Edge.
    /// </summary>
    public abstract class Label
    {
		public  Label ()
		{
			Id=""+-1;
		}


		public  Label (string id)
		{
			Id=id;
		}

		string id;

		public string Id 
        {
            get {return id;}
            set{id = value;}
		}

	

        /// <summary>
        /// Permet d'afficher la description du Label pour que l'utilisateur puisse voir et comprendre les valeurs qu'il contient.
        /// </summary>
        /// <returns>Chaîne des caractères pouvant être affiché à l'utilisateur</returns>
        public abstract string toString();

        /// <summary>
        /// Indique la dissimilarité entre deux Label de même type utilisateur. Cette dissimilarité sera notamment utilisée pour conclure sur l'isomorphisme entre deux graphes. 
        /// </summary>
        /// <param name="label">Label avec lequel la dissimilarité doit être calculée</param>
        /// <returns> Dissimilarité entre les deux Label. Lorsque ces deux Label sont considérés comme identiques par l'utilisateur alors la méthode doit retourner 0.</returns>
        public abstract double dissimilarity(Label label);

        /// <summary>
        /// Permet de faire le mapping du Label vers le fichier GXL. Lorsque l'utilisateur à créé sont propre graphe avec ses propres Label, alors il est nécessaire d'utiliser cette méthode afin que les Label puissent être écrits dans le fichier GXL.
        /// </summary>
        /// <returns>Liste d'AttributeGXL représentant le Label. </returns>
        public abstract List<AttributeGXL> toAttributes();

        /// <summary>
        /// Permet de faire le mapping du fichier GXL vers les Label. Lors de la lecture du fichier GXL, les Label sont stockés sous forme d'AttributeGXL dans Node et Edge. Il faut alors indiquer comment faire le mapping entre l'AttributeGXL et le Label.
        /// </summary>
        /// <param name="attributes">Liste d'AttributeGXL contenant les informations sur les valeurs du Label</param>
        public abstract void fromAttributes(List<AttributeGXL> attributes);


		//public abstract Label copy();

    }
}
