using System.Globalization;
using MediaBrowser.Controller.Configuration;
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace MediaBrowser.Controller.Localization
{
    /// 
    /// Class Ratings
    /// 
    public static class Ratings
    {
        public static IServerConfigurationManager ConfigurationManager;
        /// 
        /// The ratings def
        /// 
        private static RatingsDefinition ratingsDef;
        /// 
        /// The _ratings dict
        /// 
        private static Dictionary _ratingsDict;
        /// 
        /// Gets the ratings dict.
        /// 
        /// The ratings dict.
        public static Dictionary RatingsDict
        {
            get { return _ratingsDict ?? (_ratingsDict = Initialize(false, ConfigurationManager)); }
        }
        /// 
        /// The ratings strings
        /// 
        private static readonly Dictionary ratingsStrings = new Dictionary();
        /// 
        /// Tries the add.
        /// 
        /// The type of the T key.
        /// The type of the T value.
        /// The dictionary.
        /// The key.
        /// The value.
        /// true if XXXX, false otherwise
        private static void TryAdd(Dictionary dictionary, TKey key, TValue value)
        {
            if (dictionary.ContainsKey(key))
            {
                return;
            }
            dictionary.Add(key, value);
        }
        /// 
        /// Initializes the specified block unrated.
        /// 
        /// if set to true [block unrated].
        /// Dictionary{System.StringSystem.Int32}.
        public static Dictionary Initialize(bool blockUnrated, IServerConfigurationManager configurationManager)
        {
            //build our ratings dictionary from the combined local one and us one
            ratingsDef = new RatingsDefinition(Path.Combine(configurationManager.ApplicationPaths.LocalizationPath, "Ratings-" + configurationManager.Configuration.MetadataCountryCode + ".txt"), configurationManager);
            //global value of None
            var dict = new Dictionary { { "None", -1 } };
            foreach (var pair in ratingsDef.RatingsDict)
            {
                TryAdd(dict, pair.Key, pair.Value);
            }
            if (configurationManager.Configuration.MetadataCountryCode.ToUpper() != "US")
            {
                foreach (var pair in new USRatingsDictionary())
                {
                    TryAdd(dict, pair.Key, pair.Value);
                }
            }
            //global values of CS
            TryAdd(dict, "CS", 1000);
            TryAdd(dict, "", blockUnrated ? 1000 : 0);
            //and rating reverse lookup dictionary (non-redundant ones)
            ratingsStrings.Clear();
            var lastLevel = -10;
            ratingsStrings.Add(-1, LocalizedStrings.Instance.GetString("Any"));
            foreach (var pair in ratingsDef.RatingsDict.OrderBy(p => p.Value))
            {
                if (pair.Value > lastLevel)
                {
                    lastLevel = pair.Value;
                    TryAdd(ratingsStrings, pair.Value, pair.Key);
                }
            }
            TryAdd(ratingsStrings, 999, "CS");
            return dict;
        }
        /// 
        /// Switches the unrated.
        /// 
        /// if set to true [block].
        public static void SwitchUnrated(bool block)
        {
            RatingsDict.Remove("");
            RatingsDict.Add("", block ? 1000 : 0);
        }
        /// 
        /// Levels the specified rating STR.
        /// 
        /// The rating STR.
        /// System.Int32.
        public static int Level(string ratingStr)
        {
            if (ratingStr == null) ratingStr = "";
            if (RatingsDict.ContainsKey(ratingStr))
                return RatingsDict[ratingStr];
            string stripped = StripCountry(ratingStr);
            if (RatingsDict.ContainsKey(stripped))
                return RatingsDict[stripped];
            return RatingsDict[""]; //return "unknown" level
        }
        /// 
        /// Strips the country.
        /// 
        /// The rating.
        /// System.String.
        private static string StripCountry(string rating)
        {
            int start = rating.IndexOf('-');
            return start > 0 ? rating.Substring(start + 1) : rating;
        }
        /// 
        /// Returns a  that represents this instance.
        /// 
        /// The level.
        /// A  that represents this instance.
        public static string ToString(int level)
        {
            //return the closest one
            while (level > 0)
            {
                if (ratingsStrings.ContainsKey(level))
                    return ratingsStrings[level];
                level--;
            }
            return ratingsStrings.Values.FirstOrDefault(); //default to first one
        }
        /// 
        /// To the strings.
        /// 
        /// List{System.String}.
        public static List ToStrings()
        {
            //return the whole list of ratings strings
            return ratingsStrings.Values.ToList();
        }
        /// 
        /// To the values.
        /// 
        /// List{System.Int32}.
        public static List ToValues()
        {
            //return the whole list of ratings values
            return ratingsStrings.Keys.ToList();
        }
        //public Microsoft.MediaCenter.UI.Image RatingImage(string rating)
        //{
        //    return Helper.GetMediaInfoImage("Rated_" + rating);
        //}
    }
}