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

namespace WindStressPRM
{
    /// <summary>
    /// Cell obj for regular prognostic wind field
    /// Объект ячейки для поля прогностического ветра на высоте 10м на регулярной сетке
    /// </summary>
    public class PrognosticCell
    {
        /// <summary>
        /// U - component of wind velocity, m/s
        /// U - компонента скорости ветра, м/с
        /// </summary>
        public double VelocityX { get; private set; }
        /// <summary>
        /// V - component of wind velocity, m/s
        /// V - компонента скорости ветра, м/с 
        /// </summary>
        public double VelocityY { get; private set; }
        /// <summary>
        /// designated constructor
        /// </summary>
        /// <param name="coord"> Coordinate pair, координаты ячейки </param>
        /// <param name="vX"> U component m/s, скорость ветра по X м/с, NaN если значение отсутствует </param>
        /// <param name="vY"> V component m/s, скорость ветра по Y м/с, NaN если значение отсутствует</param>
        public PrognosticCell(double vX, double vY)
        {
            this.VelocityX = vX;
            this.VelocityY = vY;
            this.CheckValue();
        }
        /// <summary>
        /// Проверка полей на валидность
        /// </summary>
        /// <returns></returns>
        private void CheckValue()
        {
            bool res1 = Double.IsNaN(VelocityX);
            bool res2 = Double.IsNaN(VelocityY);
            if (res1 != res2)
            {
                throw new System.ArgumentException("Prognostic wind velocities are incorrect: one projection is Nan, and other has value.");
            }
            else if (res2 == true)
            {
                // пустые данные (Nan, Nan)
                return;
            }
            ///Скорость ветра на высоте 10м от поверхности на Земле не может превышать 70м/c
            double module = Math.Sqrt(Math.Abs(Math.Pow(VelocityX, 2) + Math.Pow(VelocityY, 2)));
            if (module > 70) 
            {
                throw new System.ArgumentOutOfRangeException("Module of wind speed", module, "Expected 0<Module<=70"); 
            }
        }
    }
}