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

namespace WindStressPRM
{
    /// <summary>
    /// Cell obj for climate wind regular data
    /// Объект - ячейка поля модуля ветра определенной повторяемости на 10м на регулярной сетке
    /// </summary>
    public class ClimateCell
    {
        /// <summary>
        /// once-in-5-years frequency wind module, m/s 
        /// модуль скорости ветра с повторяемостью один раз в 5 лет, м/с
        /// </summary>
        public double Wind5;
        /// <summary>
        /// once-in-10-years frequency wind module, m/s
        /// модуль скорости ветра с повторяемостью один раз в 10 лет, м/с
        /// </summary>
        public double Wind10 { get; private set; }
        /// <summary>
        /// once-in-15-years frequency wind module, m/s
        /// модуль скорости ветра с повторяемостью один раз в 15 лет, м/с
        /// </summary>
        public double Wind15 { get; private set; }
        /// <summary>
        /// once-in-25-years frequency wind module, m/s
        /// модуль скорости ветра с повторяемостью один раз в 25 лет, м/с
        /// для ЛЭП, построенных после 1987 года.
        /// </summary>
        public double Wind25 { get; private set; }
        /// <summary>
        /// designated constructor, NaN интерпретируется как отсутствие значения параметра в ячейке.
        /// </summary>
        /// <param name="coord"></param>
        /// <param name="w5"> скорость ветра повторяемости один раз в 5 лет, м/с</param>
        /// <param name="w10"> скорость ветра повторяемости один раз в 10 лет, м/с</param>
        /// <param name="w15"> скорость ветра повторяемости один раз в 15 лет, м/с</param>
        /// <param name="w25"> скорость ветра повторяемости один раз в 25 лет, м/с (для ЛЭП постройки после 1986г)</param>
        public ClimateCell(double w5, double w10, double w15, double w25)
        {
            this.Wind5 = w5;
            this.Wind10 = w10;
            this.Wind15 = w15;
            this.Wind25 = w25;
            this.CheckValue();
        }
        /// <summary>
        /// Провекра валидности полей класса
        /// </summary>
        /// <returns></returns>
        private void CheckValue()
        {
            double w5 = Wind5;
            double w10 = Wind10;
            double w15 = Wind15;
            double w25 = Wind25;
            if (Double.IsNaN(w5)) // if is Nan - zerofied it.
            {
                w5 = 0;
            }
            if (Double.IsNaN(w10))
            {
                w10 = 0;
            }
            if (Double.IsNaN(w15))
            {
                w15 = 0;
            }
            if (Double.IsNaN(w25)) 
            {
                w25 = 0;
            }
            // ветер по модулю не должен превышать 70м/с
            if (w5 < 0 || w5 > 70)
            { 
                throw new System.ArgumentOutOfRangeException("w5", w5, "Expected 0=<w5<70"); 
            }
            if (w10 < 0 || w10 > 70) 
            { 
                throw new System.ArgumentOutOfRangeException("w10", w10, "Expected 0=<w10<70");
            }
            if (w15 < 0 || w15 > 70) 
            {
                throw new System.ArgumentOutOfRangeException("w15", w15, "Expected 0=<w15<70");
            }
            if (w25 < 0 || w25 > 70) 
            {
                throw new System.ArgumentOutOfRangeException("w25", w25, "Expected 0=<w25<70"); 
            }
        }
    }
}