using System;
using System.Globalization;
using System.Xml;
namespace MediaBrowser.Controller.Extensions
{
    /// 
    /// Class XmlExtensions
    /// 
    public static class XmlExtensions
    {
        /// 
        /// Safes the get int32.
        /// 
        /// The doc.
        /// The path.
        /// System.Int32.
        public static int SafeGetInt32(this XmlDocument doc, string path)
        {
            return SafeGetInt32(doc, path, 0);
        }
        /// 
        /// Safes the get int32.
        /// 
        /// The doc.
        /// The path.
        /// The default int.
        /// System.Int32.
        public static int SafeGetInt32(this XmlDocument doc, string path, int defaultInt)
        {
            XmlNode rvalNode = doc.SelectSingleNode(path);
            if (rvalNode != null && rvalNode.InnerText.Length > 0)
            {
                int rval;
                if (Int32.TryParse(rvalNode.InnerText, out rval))
                {
                    return rval;
                }
            }
            return defaultInt;
        }
        /// 
        /// The _us culture
        /// 
        private static readonly CultureInfo _usCulture = new CultureInfo("en-US");
        /// 
        /// Safes the get single.
        /// 
        /// The doc.
        /// The path.
        /// The min value.
        /// The max value.
        /// System.Single.
        public static float SafeGetSingle(this XmlDocument doc, string path, float minValue, float maxValue)
        {
            XmlNode rvalNode = doc.SelectSingleNode(path);
            if (rvalNode != null && rvalNode.InnerText.Length > 0)
            {
                float rval;
                // float.TryParse is local aware, so it can be probamatic, force us culture
                if (float.TryParse(rvalNode.InnerText, NumberStyles.AllowDecimalPoint, _usCulture, out rval))
                {
                    if (rval >= minValue && rval <= maxValue)
                    {
                        return rval;
                    }
                }
            }
            return minValue;
        }
        /// 
        /// Safes the get string.
        /// 
        /// The doc.
        /// The path.
        /// System.String.
        public static string SafeGetString(this XmlDocument doc, string path)
        {
            return SafeGetString(doc, path, null);
        }
        /// 
        /// Safes the get string.
        /// 
        /// The doc.
        /// The path.
        /// The default string.
        /// System.String.
        public static string SafeGetString(this XmlDocument doc, string path, string defaultString)
        {
            XmlNode rvalNode = doc.SelectSingleNode(path);
            if (rvalNode != null && rvalNode.InnerText.Trim().Length > 0)
            {
                return rvalNode.InnerText;
            }
            return defaultString;
        }
        /// 
        /// Safes the get string.
        /// 
        /// The doc.
        /// The path.
        /// System.String.
        public static string SafeGetString(this XmlNode doc, string path)
        {
            return SafeGetString(doc, path, null);
        }
        /// 
        /// Safes the get string.
        /// 
        /// The doc.
        /// The path.
        /// The default value.
        /// System.String.
        public static string SafeGetString(this XmlNode doc, string path, string defaultValue)
        {
            XmlNode rvalNode = doc.SelectSingleNode(path);
            if (rvalNode != null && rvalNode.InnerText.Length > 0)
            {
                return rvalNode.InnerText;
            }
            return defaultValue;
        }
        /// 
        /// Reads the string safe.
        /// 
        /// The reader.
        /// System.String.
        public static string ReadStringSafe(this XmlReader reader)
        {
            var val = reader.ReadElementContentAsString();
            return string.IsNullOrWhiteSpace(val) ? null : val;
        }
        /// 
        /// Reads the value safe.
        /// 
        /// The reader.
        /// System.String.
        public static string ReadValueSafe(this XmlReader reader)
        {
            reader.Read();
            var val = reader.Value;
            return string.IsNullOrWhiteSpace(val) ? null : val;
        }
        /// 
        /// Reads a float from the current element of an XmlReader
        /// 
        /// The reader.
        /// System.Single.
        public static float ReadFloatSafe(this XmlReader reader)
        {
            string valueString = reader.ReadElementContentAsString();
            float value = 0;
            if (!string.IsNullOrWhiteSpace(valueString))
            {
                // float.TryParse is local aware, so it can be probamatic, force us culture
                float.TryParse(valueString, NumberStyles.AllowDecimalPoint, _usCulture, out value);
            }
            return value;
        }
        /// 
        /// Reads an int from the current element of an XmlReader
        /// 
        /// The reader.
        /// System.Int32.
        public static int ReadIntSafe(this XmlReader reader)
        {
            string valueString = reader.ReadElementContentAsString();
            int value = 0;
            if (!string.IsNullOrWhiteSpace(valueString))
            {
                int.TryParse(valueString, out value);
            }
            return value;
        }
    }
}