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

namespace WindStressPRM
{
    /// <summary>
    /// power line object
    /// объект - ЛЭП
    /// </summary>
    public class Powerline
    {
        /// <summary>
        ///  unique id
        ///  уникальный идентификатор 
        /// </summary>
        public int Identifier { get; set; }
        /// <summary>
        /// year of construction
        /// год постройки ЛЭП
        /// </summary>
        public int Year { get; set; }
        /// <summary>
        /// average height of cable span between two poles, meters
        /// средняя высота пролета, м
        /// </summary>
        public double Height { get; set; }
        /// <summary>
        /// voltage class kV for switches
        /// Напряжение ЛЭП, кВ
        /// </summary>
        public int Voltage { get; set; }
        /// <summary>
        /// Line vertices coordinate list
        /// список координат вершин ЛЭП как линейного объекта
        /// </summary>
        public IList<Coordinate> Coordinates { get; set; }
        /// <summary>
        /// assigned powerstation/pole
        /// идентификатор соответсвующего конца/начала линии (столб, трансформаторная подстанция, понижающая подстанция)
        /// </summary>
        public int PointFromID { get; set; }
        /// <summary>
        /// assigned powerstation/pole
        /// идентификатор соответсвующего конца/начала линии (столб, трансформаторная подстанция, понижающая подстанция)
        /// </summary>
        public int PointToID { get; set; }
        /// <summary>
        /// broken/not broken switch
        /// сломана (true) или нет (false) линяя
        /// </summary>
        public bool IsBroken { get; set; }
        /// <summary>
        /// power on switch
        /// получает (true) или нет (false) линия питание
        /// </summary>
        public bool IsON { get; set; }
        /// <summary>
        /// designated constructor
        /// </summary>
        /// <param name="coord"> Line vertices coordinate list/список координат вершин ЛЭП как линейного объекта</param>
        /// <param name="id"> uniq  id/уникальный идентификатор </param>
        /// <param name="year">year of construction/год постройки ЛЭП </param>
        /// <param name="height"> average height of cable span between two poles, meters/средняя высота пролета, м</param>
        /// <param name="voltage"> voltage class kV for switches, Напряжение ЛЭП, кВ</param>
        /// <param name="toID"> assigned powerstation/pole/идентификатор соответсвующего конца/начала линии (столб, трансформаторная подстанция, понижающая подстанция)</param>
        /// <param name="fromID"> assigned powerstation/pole/идентификатор соответсвующего конца/начала линии (столб, трансформаторная подстанция, понижающая подстанция)</param>
        public Powerline(IList<Coordinate> coordinates, int id, int year, double height, int voltage, int toID, int fromID)
        {
            this.Coordinates = coordinates;
            this.Identifier = id;
            this.Year = year;
            this.Height = height;
            this.Voltage = voltage;
            this.IsBroken = false;
            this.IsON = false;
            this.PointFromID = fromID;
            this.PointToID = toID;
            this.CheckValue();
        }
        /// <summary>
        /// проверка валидности полей
        /// </summary>
        /// <returns></returns>
        private void CheckValue()
        {
            if (Identifier < 0)
            { 
                throw new System.ArgumentOutOfRangeException("Identifier", Identifier, "Expected >0"); 
            }
            if (Year > 2050 || Year < 1900)
            {
                throw new System.ArgumentOutOfRangeException("Year", Year, "Expected 1900<=Year<=2050");
            }
            if (Height <= 0 || Height > 50) 
            {
                throw new System.ArgumentOutOfRangeException("Height", Height, "Expected 0<Height<=50"); 
            }
            if (Voltage <= 0 || Voltage > 1500)
            { 
                throw new System.ArgumentOutOfRangeException("Voltage", Voltage, "Expected 0<Voltage<=1500");
            }
            if (PointFromID < 0)
            {
                throw new System.ArgumentOutOfRangeException("PointFromID", PointFromID, "Expected >0");
            }
            if (PointToID < 0)
            {
                throw new System.ArgumentOutOfRangeException("PointToID", PointToID, "Expected >0"); 
            }
        }
    }
}