using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Serialization;
using TransportGame.Primitives;
namespace TransportGame.Model.Road
{
    /// 
    /// Road node
    /// 
    [XmlRoot("node")]
    public class RoadNode : IPositionable
    {
        /// 
        /// Gets or sets a unique identifier for this node
        /// 
        [XmlAttribute("id")]
        public int Id { get; set; }
        /// 
        /// Gets or sets the X coordinate of the node
        /// 
        [XmlAttribute("x")]
        public float X { get; set; }
        /// 
        /// Gets or sets the Y coordinate of the node
        /// 
        [XmlAttribute("y")]
        public float Y { get; set; }
        /// 
        /// Gets or sets the adjacent articulation segment IDs
        /// 
        [XmlArray("articulationSegments")]
        [XmlArrayItem("id")]
        public List ArticulationSegmentIds { get; set; }
        /// 
        /// Gets or sets the adjacent articulation segment IDs
        /// 
        [XmlArray("intersectionSegments")]
        [XmlArrayItem("id")]
        public List IntersectionSegmentIds { get; set; }
        /// 
        /// Gets or sets the parent network
        /// 
        [XmlIgnore]
        public RoadNetwork ParentNetwork { get; set; }
        /// 
        /// Gets the adjacent articulation segments
        /// 
        [XmlIgnore]
        public IEnumerable ArticulationSegments
        {
            get
            {
                return ArticulationSegmentIds.Select(id => ParentNetwork.ArticulationSegments[id]);
            }
        }
        /// 
        /// Gets the adjacent segments
        /// 
        [XmlIgnore]
        public IEnumerable Segments
        {
            get
            {
                return IntersectionSegmentIds.Select(id => ParentNetwork.ArticulationSegments[id]);
            }
        }
        /// 
        /// Initializes the node
        /// 
        public RoadNode()
        {
            ArticulationSegmentIds = new List();
            IntersectionSegmentIds = new List();
        }
        /// 
        /// Gets or sets the position
        /// 
        [XmlIgnore]
        public Vector2 Position
        {
            get
            {
                return new Vector2(X, Y);
            }
            set
            {
                X = value.X;
                Y = value.Y;
            }
        }
        public override string ToString()
        {
            return string.Format("(node id={0}, {1})", Id, Position);
        }
    }
}