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

namespace Graphs
{
    /// <summary>
    /// Modélise un arc ou une arête d'un graphe.
    /// </summary>
    public class Edge : GraphComponent
    {

       
        /// <summary>
        /// Noeud source de l'arc dans un graphe orienté. Lors d'un graphe non orienté source et target n'ont pas d'importance.
        /// </summary>
        Node nodeSource;

        /// <summary>
        /// Noeud de destination de l'arc dans un graphe orienté. Lors d'un graphe non orienté source et target n'ont pas d'importance.
        /// </summary>
        Node nodeTarget;



       
        /// <summary>
        /// Noeud source de l'arc dans un graphe orienté. Lors d'un graphe non orienté source et target n'ont pas d'importance.
        /// </summary>
        public Node NodeSource
        {
            get { return nodeSource; }
            set { nodeSource = value; }
        }

        /// <summary>
        /// Noeud de destination de l'arc dans un graphe orienté. Lors d'un graphe non orienté source et target n'ont pas d'importance.
        /// </summary>
        public Node NodeTarget
        {
            get { return nodeTarget; }
            set { nodeTarget = value; }
        }

  

        /// <summary>
        /// Initialise l'arc/arête avec les valeurs par défaut 
        /// </summary>
        /// <value>Id = null</value>
        /// <value>Label = null</value>
        public Edge()
        {
            Id = null;
            NodeSource = nodeSource;
            NodeTarget = nodeTarget;
			Label = null;
			IsNode=false;
        }


		 /// <summary>
        /// Initialise l'arc/arête avec les valeurs par défaut 
        /// </summary>
        /// <value>Id = null</value>
        /// <value>Label = null</value>
        public Edge(string id)
        {
            Id = id;
            NodeSource = nodeSource;
            NodeTarget = nodeTarget;
            Label = null;
    		IsNode=false;
        }


        /// <summary>
        /// Constructeur à utiliser lorsque l'arc/arête a un identifiant.
        /// </summary>
        /// <param name="id">Identifiant de l'arc/arête</param>
        /// <param name="nodeSource">Noeud source de l'arc</param>
        /// <param name="nodeTarget">Noeud de destination de l'arc</param>
        /// <param name="label">Contient tous les attributs de l'arc/arête</param>
        public Edge(string id, Node nodeSource, Node nodeTarget, Label label)
        {
            Id = id;
            NodeSource = nodeSource;
            NodeTarget = nodeTarget;
            Label = label;
    		IsNode=false;
        }

        /// <summary>
        /// Constructeur à utiliser lorsqu'on ne souhaite pas d'identifiant pour l'arc/arête.
        /// </summary>
        /// <param name="nodeSource">Noeud source de l'arc</param>
        /// <param name="nodeTarget">Noeud de destination de l'arc</param>
        /// <param name="label">Contient tous les attributs de l'arc/arête</param>
        public Edge(Node nodeSource, Node nodeTarget, Label label)
        {
            Id = null;
            NodeSource = nodeSource;
            NodeTarget = nodeTarget;
            Label = label;
    		IsNode=false;
        }

        /// <summary>
        /// La méthode getOtherNode renvoie le Noeud de l'arc qui n'est pas en paramètre
        /// </summary>
        /// <param name="n">Noeud de l'arc</param>
        /// <returns>Retourne le noeud qui n'es pas en paramètre</returns>
        public Node getOtherNode(Node n)
        {
            if (n.Equals(this.nodeSource))
                return this.nodeTarget;
            else
                return this.nodeSource;
        }

    }
}
