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

namespace Graphs
{
    /// <summary>
    /// Modélise un noeud d'un graphe.
    /// </summary>
    public class Node : GraphComponent
    {

        /// <summary>
        /// Liste des arcs entrants. Lorsqu'un graphe est non orienté, alors ListeEdgesIn est vide car toutes les arêtes sont contenus dans <c>listeEdgesOut</c>
        /// </summary>
        List<Edge> listEdgesIn;

        /// <summary>
        /// Liste des arcs sortants. Lorsqu'un graphe est non orienté, alors ListEdgesOut contient toutes les arêtes du noeud.
        /// </summary>
        List<Edge> listEdgesOut;

     
        /// <summary>
        /// Liste des arcs entrants. Lorsqu'un graphe est non orienté, alors ListeEdgesIn est vide car toutes les arêtes sont contenues dans ListeEdgesOut.
        /// </summary>
        public List<Edge> ListEdgesIn
        {
            get { return listEdgesIn; }
            set { listEdgesIn = value; }
        }

        /// <summary>
        /// Liste des arcs sortants. Lorsqu'un graphe est non orienté, alors listEdgesOut contient toutes les arêtes du noeud.
        /// </summary>
        public List<Edge> ListEdgesOut
        {
            get { return listEdgesOut; }
            set { listEdgesOut = value; }
        }


       
        /// <summary>
        /// Initialise le noeud avec les valeurs par défaut.
        /// </summary>
        /// <value>Id = null</value>
        /// <value>Label = null</value>
        public Node()
        {
            Id = null;
            ListEdgesIn = new List<Edge>();
            ListEdgesOut = new List<Edge>();
            Label = null;
         	IsNode=true;
        }

        /// <summary>
        /// Initialise le noeud avec son identifiant. Il n'y a ici aucune vérification sur id. La vérification se fait dans Graph.addNode.
        /// </summary>
        /// <param name="id">Id du noeud </param>
        public Node(string id)
        {
            Id = id;

            ListEdgesIn = new List<Edge>();
            ListEdgesOut = new List<Edge>();
            Label = null;
         	IsNode=true;

        }


        /// <summary>
        /// La fonction compareDegree permet de comparer le degré du Node en paramètre avec le noeud actuel (this).
        /// </summary>
        /// <param name="node">Node à comparer</param>
        /// <returns>Retourne 0 si les degrés sont égaux, 1 si le noeud actuel a un degré plus élevé et -1 sinon</returns>
        public int compareDegree(Node node)
        {
            if (this == null)
            {
                if (node == null)
                {
                    //If this and node are null, they're equal
                    return 0;
                }
                else
                {
                    //If this is null and node is not null, node2 is greater. 
                    return -1;
                }
            }
            else
            {
                // If this is not null...
                if (node == null)
                // ...and node is null, this is greater.
                {
                    return 1;
                }
                else
                {
                    // ...and node is not null, compare the edge number of the two nodes
                    return (ListEdgesIn.Count + ListEdgesOut.Count).CompareTo(node.ListEdgesIn.Count + node.ListEdgesOut.Count);
                }
            }
        }

    }
}
