using System;
using System.Collections;
using System.Collections.Generic;

namespace Cryville.Common.Culture {
	public static class ScriptUtils {
		public static string[] Scripts = new string[] { "adlm", "afak", "aghb", "ahom", "arab", "aran", "armi", "armn", "avst", "bali", "bamu", "bass", "batk", "beng", "bhks", "blis", "bopo", "brah", "brai", "bugi", "buhd", "cakm", "cans", "cari", "cham", "cher", "chrs", "cirt", "copt", "cpmn", "cprt", "cyrl", "cyrs", "deva", "diak", "dogr", "dsrt", "dupl", "egyd", "egyh", "egyp", "elba", "elym", "ethi", "geok", "geor", "glag", "gong", "gonm", "goth", "gran", "grek", "gujr", "guru", "hanb", "hang", "hani", "hano", "hans", "hant", "hatr", "hebr", "hira", "hluw", "hmng", "hmnp", "hrkt", "hung", "inds", "ital", "jamo", "java", "jpan", "jurc", "kali", "kana", "khar", "khmr", "khoj", "kitl", "kits", "knda", "kore", "kpel", "kthi", "lana", "laoo", "latf", "latg", "latn", "leke", "lepc", "limb", "lina", "linb", "lisu", "loma", "lyci", "lydi", "mahj", "maka", "mand", "mani", "marc", "maya", "medf", "mend", "merc", "mero", "mlym", "modi", "mong", "moon", "mroo", "mtei", "mult", "mymr", "nand", "narb", "nbat", "newa", "nkdb", "nkgb", "nkoo", "nshu", "ogam", "olck", "orkh", "orya", "osge", "osma", "ougr", "palm", "pauc", "pcun", "pelm", "perm", "phag", "phli", "phlp", "phlv", "phnx", "piqd", "plrd", "prti", "psin", "qaaa", "qaai", "qabx", "ranj", "rjng", "rohg", "roro", "runr", "samr", "sara", "sarb", "saur", "sgnw", "shaw", "shrd", "shui", "sidd", "sind", "sinh", "sogd", "sogo", "sora", "soyo", "sund", "sylo", "syrc", "syre", "syrj", "syrn", "tagb", "takr", "tale", "talu", "taml", "tang", "tavt", "telu", "teng", "tfng", "tglg", "thaa", "thai", "tibt", "tirh", "toto", "ugar", "vaii", "visp", "wara", "wcho", "wole", "xpeo", "xsux", "yezi", "yiii", "zanb", "zinh", "zmth", "zsye", "zsym", "zxxx", "zyyy", "zzzz", };
		public static string UltimateFallbackScript = "zyyy";
		public static Dictionary<string, string[]> FallbackScriptMap = new Dictionary<string, string[]> {
			{ "aran", new string[] { "arab" } }, { "cyrs", new string[] { "cyrl" } },
			{ "hanb", new string[] { "hant", "bopo" } }, { "hans", new string[] { "hani" } }, { "hant", new string[] { "hani" } },
			{ "hrkt", new string[] { "hira", "kana" } }, { "jpan", new string[] { "hani", "hira", "kana" } },
			{ "jamo", new string[] { "hang" } }, { "kore", new string[] { "hang", "hani" } },
			{ "latf", new string[] { "latn" } }, { "latg", new string[] { "latn" } },
			{ "syre", new string[] { "syrc" } }, { "syrj", new string[] { "syrc" } }, { "syrn", new string[] { "syrc" } },
			{ "zsye", new string[] { "zsym" } },
		};
		public static void FillKeysWithScripts(IDictionary dict, Func<object> value) {
			foreach (var s in Scripts) dict.Add(s, value());
		}
		public static IEnumerable<string> EnumerateFallbackScripts(string script) {
			if (string.IsNullOrEmpty(script)) throw new ArgumentNullException("script");
			script = script.ToLower();
			if (script == UltimateFallbackScript) {
				yield return null;
				yield break;
			}
			string[] fblist;
			if (FallbackScriptMap.TryGetValue(script, out fblist)) {
				foreach (var fb in fblist) {
					yield return fb;
				}
			}
			else yield return UltimateFallbackScript;
		}
	}
}
