namespace ThingsGateway.Admin.Application
{
    /// <summary>
    /// UserAgent settings container.
    /// </summary>
    public class UserAgentSettings
    {
        /// <summary>
        /// Gets or sets the maximum size of the useragent string. Limiting the length of the useragent string protects from hackers sending in extremely long user agent strings.
        /// </summary>
        public int UaStringSizeLimit { get; set; } = 512;

        /// <summary>
        /// Gets a dictionary containing mappings for platforms.
        /// </summary>
        public Dictionary<string, string> Platforms { get; } = new()
        {
            {"windows nt 10.0", "Windows 10"},
            {"windows nt 6.3", "Windows 8.1"},
            {"windows nt 6.2", "Windows 8"},
            {"windows nt 6.1", "Windows 7"},
            {"windows nt 6.0", "Windows Vista"},
            {"windows nt 5.2", "Windows 2003"},
            {"windows nt 5.1", "Windows XP"},
            {"windows nt 5.0", "Windows 2000"},
            {"windows nt 4.0", "Windows NT 4.0"},
            {"winnt4.0", "Windows NT 4.0"},
            {"winnt 4.0", "Windows NT"},
            {"winnt", "Windows NT"},
            {"windows 98", "Windows 98"},
            {"win98", "Windows 98"},
            {"windows 95", "Windows 95"},
            {"win95", "Windows 95"},
            {"windows phone", "Windows Phone"},
            {"windows", "Unknown Windows OS"},
            {"android", "Android"},
            {"blackberry", "BlackBerry"},
            {"iphone", "iOS"},
            {"ipad", "iOS"},
            {"ipod", "iOS"},
            {"os x", "Mac OS X"},
            {"ppc mac", "Power PC Mac"},
            {"freebsd", "FreeBSD"},
            {"ppc", "Macintosh"},
            {"linux", "Linux"},
            {"debian", "Debian"},
            {"sunos", "Sun Solaris"},
            {"beos", "BeOS"},
            {"apachebench", "ApacheBench"},
            {"aix", "AIX"},
            {"irix", "Irix"},
            {"osf", "DEC OSF"},
            {"hp-ux", "HP-UX"},
            {"netbsd", "NetBSD"},
            {"bsdi", "BSDi"},
            {"openbsd", "OpenBSD"},
            {"gnu", "GNU/Linux"},
            {"unix", "Unknown Unix OS"},
            {"symbian", "Symbian OS"},
        };

        /// <summary>
        /// Gets a dictionary containing mappings for browsers.
        /// </summary>
        public Dictionary<string, string> Browsers { get; } = new()
        {
            {"Microsoft Outlook", "Microsoft Outlook"},
            {"OPR", "Opera"},
            {"Flock", "Flock"},
            {"Edge", "Edge"},
            {"Edg", "Edge"},
            {"Chrome", "Chrome"},
            {"Opera.*?Version", "Opera"},
            {"Opera", "Opera"},
            {"MSIE", "Internet Explorer"},
            {"Internet Explorer", "Internet Explorer"},
            {"Trident.* rv" , "Internet Explorer"},
            {"Shiira", "Shiira"},
            {"Firefox", "Firefox"},
            {"Chimera", "Chimera"},
            {"Phoenix", "Phoenix"},
            {"Firebird", "Firebird"},
            {"Camino", "Camino"},
            {"Netscape", "Netscape"},
            {"OmniWeb", "OmniWeb"},
            {"Safari", "Safari"},
            {"Mozilla", "Mozilla"},
            {"Konqueror", "Konqueror"},
            {"icab", "iCab"},
            {"Lynx", "Lynx"},
            {"Links", "Links"},
            {"hotjava", "HotJava"},
            {"amaya", "Amaya"},
            {"IBrowse", "IBrowse"},
            {"Maxthon", "Maxthon"},
            {"Ubuntu", "Ubuntu Web Browser"},
            {"Vivaldi", "Vivaldi"},
        };

        /// <summary>
        /// Gets a dictionary containing mappings for mobiles.
        /// </summary>
        public Dictionary<string, string> Mobiles { get; } = new()
        {
            // Legacy
            {"mobileexplorer", "Mobile Explorer"},
            {"palmsource", "Palm"},
            {"palmscape", "Palmscape"},
            // Phones and Manufacturers
            {"motorola", "Motorola"},
            {"nokia", "Nokia"},
            {"palm", "Palm"},
            {"iphone", "Apple iPhone"},
            {"ipad", "iPad"},
            {"ipod", "Apple iPod Touch"},
            {"sony", "Sony Ericsson"},
            {"ericsson", "Sony Ericsson"},
            {"blackberry", "BlackBerry"},
            {"cocoon", "O2 Cocoon"},
            {"blazer", "Treo"},
            {"lg", "LG"},
            {"amoi", "Amoi"},
            {"xda", "XDA"},
            {"mda", "MDA"},
            {"vario", "Vario"},
            {"htc", "HTC"},
            {"samsung", "Samsung"},
            {"sharp", "Sharp"},
            {"sie-", "Siemens"},
            {"alcatel", "Alcatel"},
            {"benq", "BenQ"},
            {"ipaq", "HP iPaq"},
            {"mot-", "Motorola"},
            {"playstation portable", "PlayStation Portable"},
            {"playstation 3", "PlayStation 3"},
            {"playstation vita", "PlayStation Vita"},
            {"hiptop", "Danger Hiptop"},
            {"nec-", "NEC"},
            {"panasonic", "Panasonic"},
            {"philips", "Philips"},
            {"sagem", "Sagem"},
            {"sanyo", "Sanyo"},
            {"spv", "SPV"},
            {"zte", "ZTE"},
            {"sendo", "Sendo"},
            {"nintendo dsi", "Nintendo DSi"},
            {"nintendo ds", "Nintendo DS"},
            {"nintendo 3ds", "Nintendo 3DS"},
            {"wii", "Nintendo Wii"},
            {"open web", "Open Web"},
            {"openweb", "OpenWeb"},
            // Operating Systems
            {"android", "Android"},
            {"symbian", "Symbian"},
            {"SymbianOS", "SymbianOS"},
            {"elaine", "Palm"},
            {"series60", "Symbian S60"},
            {"windows ce", "Windows CE"},
            // Browsers
            {"obigo", "Obigo"},
            {"netfront", "Netfront Browser"},
            {"openwave", "Openwave Browser"},
            {"mobilexplorer", "Mobile Explorer"},
            {"operamini", "Opera Mini"},
            {"opera mini", "Opera Mini"},
            {"opera mobi", "Opera Mobile"},
            {"fennec", "Firefox Mobile"},
            // Other
            {"digital paths", "Digital Paths"},
            {"avantgo", "AvantGo"},
            {"xiino", "Xiino"},
            {"novarra", "Novarra Transcoder"},
            {"vodafone", "Vodafone"},
            {"docomo", "NTT DoCoMo"},
            {"o2", "O2"},
            // Fallback
            {"mobile", "Generic Mobile"},
            {"wireless", "Generic Mobile"},
            {"j2me", "Generic Mobile"},
            {"midp", "Generic Mobile"},
            {"cldc", "Generic Mobile"},
            {"up.link", "Generic Mobile"},
            {"up.browser", "Generic Mobile"},
            {"smartphone", "Generic Mobile"},
            {"cellphone", "Generic Mobile"},
        };

        /// <summary>
        /// Gets a dictionary containing mappings for robots.
        /// </summary>
        public Dictionary<string, string> Robots { get; } = new()
        {
            {"googlebot", "Googlebot"},
            {"msnbot", "MSNBot"},
            {"baiduspider", "Baiduspider"},
            {"bingbot", "Bing"},
            {"slurp", "Inktomi Slurp"},
            {"yahoo", "Yahoo"},
            {"ask jeeves", "Ask Jeeves"},
            {"fastcrawler", "FastCrawler"},
            {"infoseek", "InfoSeek Robot 1.0"},
            {"lycos", "Lycos"},
            {"yandex", "YandexBot"},
            {"mediapartners-google", "MediaPartners Google"},
            {"CRAZYWEBCRAWLER", "Crazy Webcrawler"},
            {"adsbot-google", "AdsBot Google"},
            {"feedfetcher-google", "Feedfetcher Google"},
            {"curious george", "Curious George"},
            {"ia_archiver", "Alexa Crawler"},
            {"MJ12bot", "Majestic-12"},
            {"Uptimebot", "Uptimebot"},
        };
    }
}
