using Connexien.Lib.DataAccess;
using OfficeOpenXml;
using OfficeOpenXml.Table;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using System.Net;
using System.Web;
using Brushes = System.Drawing.Brushes;

namespace Connexien.Lib
{
    public static class Utilities
    {

        public const string ContentPartnerDirectory = @"\Documents\ContentItems";

        public const string PublicationDirectory = @"\Documents\Publications";

        public const string CustomFormRequestDirectory = @"\Documents\CustomFormRequest";

        public static int GetPublicationCost()
        {
            return Convert.ToInt32(ConfigurationManager.AppSettings["Connexien:PublicationCost"]);
        }

        public static string GetSiteRootDirectory()
        {
            return HttpContext.Current.Server.MapPath("~/");
        }

        public static byte[] GetSizedPic(string guid, int width, int height, string type = "avatar", bool fill = false, string host = "")
        {
            var url = type == "cover" ? host + "/Content/images/bg1.jpg" : host + "/Content/images/default-poster.jpg";
            byte[] picture = null;

            using (var db = new ConnexienEntities())
            {
                var pic = db.ProfileImages.FirstOrDefault(x => x.Guid == guid && x.Type == type);
                if (pic != null && !String.IsNullOrWhiteSpace(pic.Filename))
                {
                    try
                    {
                        var file = Path.Combine($@"{GetSiteRootDirectory()}\ProfileImages", pic.Filename);
                        picture = File.ReadAllBytes(file);
                    }
                    catch (Exception ex)
                    {
                        Exceptions.Log(ex, String.Empty, "GetSizedPic");
                    }
                }

            }

            using (var webClient = new WebClient())
            {
                var imageBytes = picture ?? webClient.DownloadData(url);

                using (var ms1 = new MemoryStream(imageBytes))
                {
                    var img = Image.FromStream(ms1);

                    width = width == 0 ? img.Width : width;
                    height = height == 0 ? img.Height : height;

                    var ratioX = (double)width / img.Width;
                    var ratioY = (double)height / img.Height;
                    var ratio = fill ? Math.Max(ratioX, ratioY) : Math.Min(ratioX, ratioY);

                    var newWidth = (int)(img.Width * ratio);
                    var newHeight = (int)(img.Height * ratio);

                    var newImage = fill ? new Bitmap(width, height) : new Bitmap(newWidth, newHeight);
                    var xOffset = fill ? (width - newWidth) / 2 : 0;
                    var yOffset = fill ? (height - newHeight) / 2 : 0;

                    using (var g = Graphics.FromImage(newImage))
                    {
                        g.CompositingMode = CompositingMode.SourceCopy;
                        g.CompositingQuality = CompositingQuality.HighQuality;
                        g.InterpolationMode = InterpolationMode.HighQualityBicubic;
                        g.SmoothingMode = SmoothingMode.HighQuality;
                        g.PixelOffsetMode = PixelOffsetMode.HighQuality;
                        g.FillRectangle(Brushes.White, 0, 0, newImage.Width, newImage.Height);
                        g.DrawImage(img, xOffset, yOffset, newWidth, newHeight);
                    }

                    using (var ms2 = new MemoryStream())
                    {
                        newImage.Save(ms2, ImageFormat.Jpeg);
                        return ms2.ToArray();
                    }
                }
            }



        }

        public static byte[] GetArticle(string filename)
        {
            try
            {
                return ConnexienStorageBlob.DownloadBlob(filename, ConnexienStorageContainers.StorageContainer.Publications);
            }
            catch (Exception ex)
            {
                Exceptions.Log(ex, String.Empty, "GetArticle");
            }

            return null;
        }

        public static byte[] GetContentItem(string filename)
        {
            try
            {
                return ConnexienStorageBlob.DownloadBlob(filename, ConnexienStorageContainers.StorageContainer.ContentItems);
            }
            catch (Exception ex)
            {
                Exceptions.Log(ex, String.Empty, "GetContentItem");
            }

            return null;
        }

        public static byte[] GetBadge(string id, string host = "", long userId = 0, string userIp = "")
        {
            var url = host + "/Content/images/badge.jpg";

            using (var db = new ConnexienEntities())
            {
                var profile = db.Profiles.FirstOrDefault(x => (x.Vanity == id || x.Guid == id) && x.Deleted == null);
                if (profile != null)
                {
                    LogView(id, "badge", userId, userIp);
                }
            }

            using (var webClient = new WebClient())
            {
                var imageBytes = webClient.DownloadData(url);
                return imageBytes;
            }
        }

        public static byte[] GetIcon(string id, string host = "", long userId = 0, string userIp = "")
        {
            var url = host + "/Content/images/icon.png";

            using (var db = new ConnexienEntities())
            {
                var profile = db.Profiles.FirstOrDefault(x => (x.Vanity == id || x.Guid == id) && x.Deleted == null);
                if (profile != null)
                {
                    LogView(id, "icon", userId, userIp);
                }
            }

            using (var webClient = new WebClient())
            {
                var imageBytes = webClient.DownloadData(url);
                return imageBytes;
            }

        }

        //----------------------------------------------------------------

        public static void LogView(string guid, string type, long userId = 0, string userIp = "")
        {

            using (var db = new ConnexienEntities())
            {
                var p = db.Profiles.FirstOrDefault(x => x.Guid == guid && x.UserId != userId && x.Deleted == null);
                if (p == null)
                {
                    return;
                }

                var v = new ProfileView
                {
                    Created = DateTime.UtcNow,
                    ProfileId = p.Id,
                    Ip = userIp,
                    Type = type
                };

                if (userId != 0)
                {
                    v.UserId = userId;
                }

                db.ProfileViews.Add(v);
                db.SaveChanges();
            }
        }

        public static void LogArticleView(string guid, long userId = 0)
        {
            using (var db = new ConnexienEntities())
            {
                var a = db.ProfileArticles.FirstOrDefault(x => x.Guid == guid && x.Profile.UserId != userId && x.Profile.Deleted == null);
                if (a == null)
                {
                    return;
                }

                a.Views = a.Views + 1;
                db.SaveChanges();
            }
        }


        //----------------------------------------------------------------

        public static byte[] GetMemberProfiles()
        {
            byte[] excelData;
            UserProfileAccess userProfileAccess = new UserProfileAccess();

            List<CompleteProfile> completeProfiles = userProfileAccess.GetUserProfiles();
            
            ExcelPackage.LicenseContext = LicenseContext.NonCommercial;

            using (var package = new ExcelPackage())
            {
                var worksheet = package.Workbook.Worksheets.Add("MemberList");
                worksheet.Cells["A1"].LoadFromCollection(completeProfiles, true, TableStyles.Medium9);
                excelData = package.GetAsByteArray();
            }

            return excelData;
        }

        private static ImageCodecInfo GetEncoder(ImageFormat format)
        {
            var codecs = ImageCodecInfo.GetImageDecoders();
            return codecs.FirstOrDefault(codec => codec.FormatID == format.Guid);
        }

        public static class MimeTypeMap
        {
            private static readonly IDictionary<string, string> _mappings =
                new Dictionary<string, string>(StringComparer.InvariantCultureIgnoreCase)
                    {

                        #region Big freaking list of mime types
                        // combination of values from Windows 7 Registry and 
                        // from C:\Windows\System32\inetsrv\config\applicationHost.config
                        // some added, including .7z and .dat
                        {".323", "text/h323"},
                        {".3g2", "video/3gpp2"},
                        {".3gp", "video/3gpp"},
                        {".3gp2", "video/3gpp2"},
                        {".3gpp", "video/3gpp"},
                        {".7z", "application/x-7z-compressed"},
                        {".aa", "audio/audible"},
                        {".AAC", "audio/aac"},
                        {".aaf", "application/octet-stream"},
                        {".aax", "audio/vnd.audible.aax"},
                        {".ac3", "audio/ac3"},
                        {".aca", "application/octet-stream"},
                        {".accda", "application/msaccess.addin"},
                        {".accdb", "application/msaccess"},
                        {".accdc", "application/msaccess.cab"},
                        {".accde", "application/msaccess"},
                        {".accdr", "application/msaccess.runtime"},
                        {".accdt", "application/msaccess"},
                        {".accdw", "application/msaccess.webapplication"},
                        {".accft", "application/msaccess.ftemplate"},
                        {".acx", "application/internet-property-stream"},
                        {".AddIn", "text/xml"},
                        {".ade", "application/msaccess"},
                        {".adobebridge", "application/x-bridge-url"},
                        {".adp", "application/msaccess"},
                        {".ADT", "audio/vnd.dlna.adts"},
                        {".ADTS", "audio/aac"},
                        {".afm", "application/octet-stream"},
                        {".ai", "application/postscript"},
                        {".aif", "audio/x-aiff"},
                        {".aifc", "audio/aiff"},
                        {".aiff", "audio/aiff"},
                        {".air", "application/vnd.adobe.air-application-installer-package+zip"},
                        {".amc", "application/x-mpeg"},
                        {".application", "application/x-ms-application"},
                        {".art", "image/x-jg"},
                        {".asa", "application/xml"},
                        {".asax", "application/xml"},
                        {".ascx", "application/xml"},
                        {".asd", "application/octet-stream"},
                        {".asf", "video/x-ms-asf"},
                        {".ashx", "application/xml"},
                        {".asi", "application/octet-stream"},
                        {".asm", "text/plain"},
                        {".asmx", "application/xml"},
                        {".aspx", "application/xml"},
                        {".asr", "video/x-ms-asf"},
                        {".asx", "video/x-ms-asf"},
                        {".atom", "application/atom+xml"},
                        {".au", "audio/basic"},
                        {".avi", "video/x-msvideo"},
                        {".axs", "application/olescript"},
                        {".bas", "text/plain"},
                        {".bcpio", "application/x-bcpio"},
                        {".bin", "application/octet-stream"},
                        {".bmp", "image/bmp"},
                        {".c", "text/plain"},
                        {".cab", "application/octet-stream"},
                        {".caf", "audio/x-caf"},
                        {".calx", "application/vnd.ms-office.calx"},
                        {".cat", "application/vnd.ms-pki.seccat"},
                        {".cc", "text/plain"},
                        {".cd", "text/plain"},
                        {".cdda", "audio/aiff"},
                        {".cdf", "application/x-cdf"},
                        {".cer", "application/x-x509-ca-cert"},
                        {".chm", "application/octet-stream"},
                        {".class", "application/x-java-applet"},
                        {".clp", "application/x-msclip"},
                        {".cmx", "image/x-cmx"},
                        {".cnf", "text/plain"},
                        {".cod", "image/cis-cod"},
                        {".config", "application/xml"},
                        {".contact", "text/x-ms-contact"},
                        {".coverage", "application/xml"},
                        {".cpio", "application/x-cpio"},
                        {".cpp", "text/plain"},
                        {".crd", "application/x-mscardfile"},
                        {".crl", "application/pkix-crl"},
                        {".crt", "application/x-x509-ca-cert"},
                        {".cs", "text/plain"},
                        {".csdproj", "text/plain"},
                        {".csh", "application/x-csh"},
                        {".csproj", "text/plain"},
                        {".css", "text/css"},
                        {".csv", "text/csv"},
                        {".cur", "application/octet-stream"},
                        {".cxx", "text/plain"},
                        {".dat", "application/octet-stream"},
                        {".datasource", "application/xml"},
                        {".dbproj", "text/plain"},
                        {".dcr", "application/x-director"},
                        {".def", "text/plain"},
                        {".deploy", "application/octet-stream"},
                        {".der", "application/x-x509-ca-cert"},
                        {".dgml", "application/xml"},
                        {".dib", "image/bmp"},
                        {".dif", "video/x-dv"},
                        {".dir", "application/x-director"},
                        {".disco", "text/xml"},
                        {".dll", "application/x-msdownload"},
                        {".dll.config", "text/xml"},
                        {".dlm", "text/dlm"},
                        {".doc", "application/msword"},
                        {".docm", "application/vnd.ms-word.document.macroEnabled.12"},
                        {".docx", "application/vnd.openxmlformats-officedocument.wordprocessingml.document"},
                        {".dot", "application/msword"},
                        {".dotm", "application/vnd.ms-word.template.macroEnabled.12"},
                        {".dotx", "application/vnd.openxmlformats-officedocument.wordprocessingml.template"},
                        {".dsp", "application/octet-stream"},
                        {".dsw", "text/plain"},
                        {".dtd", "text/xml"},
                        {".dtsConfig", "text/xml"},
                        {".dv", "video/x-dv"},
                        {".dvi", "application/x-dvi"},
                        {".dwf", "drawing/x-dwf"},
                        {".dwp", "application/octet-stream"},
                        {".dxr", "application/x-director"},
                        {".eml", "message/rfc822"},
                        {".emz", "application/octet-stream"},
                        {".eot", "application/octet-stream"},
                        {".eps", "application/postscript"},
                        {".etl", "application/etl"},
                        {".etx", "text/x-setext"},
                        {".evy", "application/envoy"},
                        {".exe", "application/octet-stream"},
                        {".exe.config", "text/xml"},
                        {".fdf", "application/vnd.fdf"},
                        {".fif", "application/fractals"},
                        {".filters", "Application/xml"},
                        {".fla", "application/octet-stream"},
                        {".flr", "x-world/x-vrml"},
                        {".flv", "video/x-flv"},
                        {".fsscript", "application/fsharp-script"},
                        {".fsx", "application/fsharp-script"},
                        {".generictest", "application/xml"},
                        {".gif", "image/gif"},
                        {".group", "text/x-ms-group"},
                        {".gsm", "audio/x-gsm"},
                        {".gtar", "application/x-gtar"},
                        {".gz", "application/x-gzip"},
                        {".h", "text/plain"},
                        {".hdf", "application/x-hdf"},
                        {".hdml", "text/x-hdml"},
                        {".hhc", "application/x-oleobject"},
                        {".hhk", "application/octet-stream"},
                        {".hhp", "application/octet-stream"},
                        {".hlp", "application/winhlp"},
                        {".hpp", "text/plain"},
                        {".hqx", "application/mac-binhex40"},
                        {".hta", "application/hta"},
                        {".htc", "text/x-component"},
                        {".htm", "text/html"},
                        {".html", "text/html"},
                        {".htt", "text/webviewhtml"},
                        {".hxa", "application/xml"},
                        {".hxc", "application/xml"},
                        {".hxd", "application/octet-stream"},
                        {".hxe", "application/xml"},
                        {".hxf", "application/xml"},
                        {".hxh", "application/octet-stream"},
                        {".hxi", "application/octet-stream"},
                        {".hxk", "application/xml"},
                        {".hxq", "application/octet-stream"},
                        {".hxr", "application/octet-stream"},
                        {".hxs", "application/octet-stream"},
                        {".hxt", "text/html"},
                        {".hxv", "application/xml"},
                        {".hxw", "application/octet-stream"},
                        {".hxx", "text/plain"},
                        {".i", "text/plain"},
                        {".ico", "image/x-icon"},
                        {".ics", "application/octet-stream"},
                        {".idl", "text/plain"},
                        {".ief", "image/ief"},
                        {".iii", "application/x-iphone"},
                        {".inc", "text/plain"},
                        {".inf", "application/octet-stream"},
                        {".inl", "text/plain"},
                        {".ins", "application/x-internet-signup"},
                        {".ipa", "application/x-itunes-ipa"},
                        {".ipg", "application/x-itunes-ipg"},
                        {".ipproj", "text/plain"},
                        {".ipsw", "application/x-itunes-ipsw"},
                        {".iqy", "text/x-ms-iqy"},
                        {".isp", "application/x-internet-signup"},
                        {".ite", "application/x-itunes-ite"},
                        {".itlp", "application/x-itunes-itlp"},
                        {".itms", "application/x-itunes-itms"},
                        {".itpc", "application/x-itunes-itpc"},
                        {".IVF", "video/x-ivf"},
                        {".jar", "application/java-archive"},
                        {".java", "application/octet-stream"},
                        {".jck", "application/liquidmotion"},
                        {".jcz", "application/liquidmotion"},
                        {".jfif", "image/pjpeg"},
                        {".jnlp", "application/x-java-jnlp-file"},
                        {".jpb", "application/octet-stream"},
                        {".jpe", "image/jpeg"},
                        {".jpeg", "image/jpeg"},
                        {".jpg", "image/jpeg"},
                        {".js", "application/x-javascript"},
                        {".json", "application/json"},
                        {".jsx", "text/jscript"},
                        {".jsxbin", "text/plain"},
                        {".latex", "application/x-latex"},
                        {".library-ms", "application/windows-library+xml"},
                        {".lit", "application/x-ms-reader"},
                        {".loadtest", "application/xml"},
                        {".lpk", "application/octet-stream"},
                        {".lsf", "video/x-la-asf"},
                        {".lst", "text/plain"},
                        {".lsx", "video/x-la-asf"},
                        {".lzh", "application/octet-stream"},
                        {".m13", "application/x-msmediaview"},
                        {".m14", "application/x-msmediaview"},
                        {".m1v", "video/mpeg"},
                        {".m2t", "video/vnd.dlna.mpeg-tts"},
                        {".m2ts", "video/vnd.dlna.mpeg-tts"},
                        {".m2v", "video/mpeg"},
                        {".m3u", "audio/x-mpegurl"},
                        {".m3u8", "audio/x-mpegurl"},
                        {".m4a", "audio/m4a"},
                        {".m4b", "audio/m4b"},
                        {".m4p", "audio/m4p"},
                        {".m4r", "audio/x-m4r"},
                        {".m4v", "video/x-m4v"},
                        {".mac", "image/x-macpaint"},
                        {".mak", "text/plain"},
                        {".man", "application/x-troff-man"},
                        {".manifest", "application/x-ms-manifest"},
                        {".map", "text/plain"},
                        {".master", "application/xml"},
                        {".mda", "application/msaccess"},
                        {".mdb", "application/x-msaccess"},
                        {".mde", "application/msaccess"},
                        {".mdp", "application/octet-stream"},
                        {".me", "application/x-troff-me"},
                        {".mfp", "application/x-shockwave-flash"},
                        {".mht", "message/rfc822"},
                        {".mhtml", "message/rfc822"},
                        {".mid", "audio/mid"},
                        {".midi", "audio/mid"},
                        {".mix", "application/octet-stream"},
                        {".mk", "text/plain"},
                        {".mmf", "application/x-smaf"},
                        {".mno", "text/xml"},
                        {".mny", "application/x-msmoney"},
                        {".mod", "video/mpeg"},
                        {".mov", "video/quicktime"},
                        {".movie", "video/x-sgi-movie"},
                        {".mp2", "video/mpeg"},
                        {".mp2v", "video/mpeg"},
                        {".mp3", "audio/mpeg"},
                        {".mp4", "video/mp4"},
                        {".mp4v", "video/mp4"},
                        {".mpa", "video/mpeg"},
                        {".mpe", "video/mpeg"},
                        {".mpeg", "video/mpeg"},
                        {".mpf", "application/vnd.ms-mediapackage"},
                        {".mpg", "video/mpeg"},
                        {".mpp", "application/vnd.ms-project"},
                        {".mpv2", "video/mpeg"},
                        {".mqv", "video/quicktime"},
                        {".ms", "application/x-troff-ms"},
                        {".msi", "application/octet-stream"},
                        {".mso", "application/octet-stream"},
                        {".mts", "video/vnd.dlna.mpeg-tts"},
                        {".mtx", "application/xml"},
                        {".mvb", "application/x-msmediaview"},
                        {".mvc", "application/x-miva-compiled"},
                        {".mxp", "application/x-mmxp"},
                        {".nc", "application/x-netcdf"},
                        {".nsc", "video/x-ms-asf"},
                        {".nws", "message/rfc822"},
                        {".ocx", "application/octet-stream"},
                        {".oda", "application/oda"},
                        {".odc", "text/x-ms-odc"},
                        {".odh", "text/plain"},
                        {".odl", "text/plain"},
                        {".odp", "application/vnd.oasis.opendocument.presentation"},
                        {".ods", "application/oleobject"},
                        {".odt", "application/vnd.oasis.opendocument.text"},
                        {".ogv", "video/ogg"},
                        {".one", "application/onenote"},
                        {".onea", "application/onenote"},
                        {".onepkg", "application/onenote"},
                        {".onetmp", "application/onenote"},
                        {".onetoc", "application/onenote"},
                        {".onetoc2", "application/onenote"},
                        {".orderedtest", "application/xml"},
                        {".osdx", "application/opensearchdescription+xml"},
                        {".p10", "application/pkcs10"},
                        {".p12", "application/x-pkcs12"},
                        {".p7b", "application/x-pkcs7-certificates"},
                        {".p7c", "application/pkcs7-mime"},
                        {".p7m", "application/pkcs7-mime"},
                        {".p7r", "application/x-pkcs7-certreqresp"},
                        {".p7s", "application/pkcs7-signature"},
                        {".pbm", "image/x-portable-bitmap"},
                        {".pcast", "application/x-podcast"},
                        {".pct", "image/pict"},
                        {".pcx", "application/octet-stream"},
                        {".pcz", "application/octet-stream"},
                        {".pdf", "application/pdf"},
                        {".pfb", "application/octet-stream"},
                        {".pfm", "application/octet-stream"},
                        {".pfx", "application/x-pkcs12"},
                        {".pgm", "image/x-portable-graymap"},
                        {".pic", "image/pict"},
                        {".pict", "image/pict"},
                        {".pkgdef", "text/plain"},
                        {".pkgundef", "text/plain"},
                        {".pko", "application/vnd.ms-pki.pko"},
                        {".pls", "audio/scpls"},
                        {".pma", "application/x-perfmon"},
                        {".pmc", "application/x-perfmon"},
                        {".pml", "application/x-perfmon"},
                        {".pmr", "application/x-perfmon"},
                        {".pmw", "application/x-perfmon"},
                        {".png", "image/png"},
                        {".pnm", "image/x-portable-anymap"},
                        {".pnt", "image/x-macpaint"},
                        {".pntg", "image/x-macpaint"},
                        {".pnz", "image/png"},
                        {".pot", "application/vnd.ms-powerpoint"},
                        {".potm", "application/vnd.ms-powerpoint.template.macroEnabled.12"},
                        {".potx", "application/vnd.openxmlformats-officedocument.presentationml.template"},
                        {".ppa", "application/vnd.ms-powerpoint"},
                        {".ppam", "application/vnd.ms-powerpoint.addin.macroEnabled.12"},
                        {".ppm", "image/x-portable-pixmap"},
                        {".pps", "application/vnd.ms-powerpoint"},
                        {".ppsm", "application/vnd.ms-powerpoint.slideshow.macroEnabled.12"},
                        {".ppsx", "application/vnd.openxmlformats-officedocument.presentationml.slideshow"},
                        {".ppt", "application/vnd.ms-powerpoint"},
                        {".pptm", "application/vnd.ms-powerpoint.presentation.macroEnabled.12"},
                        {".pptx", "application/vnd.openxmlformats-officedocument.presentationml.presentation"},
                        {".prf", "application/pics-rules"},
                        {".prm", "application/octet-stream"},
                        {".prx", "application/octet-stream"},
                        {".ps", "application/postscript"},
                        {".psc1", "application/PowerShell"},
                        {".psd", "application/octet-stream"},
                        {".psess", "application/xml"},
                        {".psm", "application/octet-stream"},
                        {".psp", "application/octet-stream"},
                        {".pub", "application/x-mspublisher"},
                        {".pwz", "application/vnd.ms-powerpoint"},
                        {".qht", "text/x-html-insertion"},
                        {".qhtm", "text/x-html-insertion"},
                        {".qt", "video/quicktime"},
                        {".qti", "image/x-quicktime"},
                        {".qtif", "image/x-quicktime"},
                        {".qtl", "application/x-quicktimeplayer"},
                        {".qxd", "application/octet-stream"},
                        {".ra", "audio/x-pn-realaudio"},
                        {".ram", "audio/x-pn-realaudio"},
                        {".rar", "application/octet-stream"},
                        {".ras", "image/x-cmu-raster"},
                        {".rat", "application/rat-file"},
                        {".rc", "text/plain"},
                        {".rc2", "text/plain"},
                        {".rct", "text/plain"},
                        {".rdlc", "application/xml"},
                        {".resx", "application/xml"},
                        {".rf", "image/vnd.rn-realflash"},
                        {".rgb", "image/x-rgb"},
                        {".rgs", "text/plain"},
                        {".rm", "application/vnd.rn-realmedia"},
                        {".rmi", "audio/mid"},
                        {".rmp", "application/vnd.rn-rn_music_package"},
                        {".roff", "application/x-troff"},
                        {".rpm", "audio/x-pn-realaudio-plugin"},
                        {".rqy", "text/x-ms-rqy"},
                        {".rtf", "application/rtf"},
                        {".rtx", "text/richtext"},
                        {".ruleset", "application/xml"},
                        {".s", "text/plain"},
                        {".safariextz", "application/x-safari-safariextz"},
                        {".scd", "application/x-msschedule"},
                        {".sct", "text/scriptlet"},
                        {".sd2", "audio/x-sd2"},
                        {".sdp", "application/sdp"},
                        {".sea", "application/octet-stream"},
                        {".searchConnector-ms", "application/windows-search-connector+xml"},
                        {".setpay", "application/set-payment-initiation"},
                        {".setreg", "application/set-registration-initiation"},
                        {".settings", "application/xml"},
                        {".sgimb", "application/x-sgimb"},
                        {".sgml", "text/sgml"},
                        {".sh", "application/x-sh"},
                        {".shar", "application/x-shar"},
                        {".shtml", "text/html"},
                        {".sit", "application/x-stuffit"},
                        {".sitemap", "application/xml"},
                        {".skin", "application/xml"},
                        {".sldm", "application/vnd.ms-powerpoint.slide.macroEnabled.12"},
                        {".sldx", "application/vnd.openxmlformats-officedocument.presentationml.slide"},
                        {".slk", "application/vnd.ms-excel"},
                        {".sln", "text/plain"},
                        {".slupkg-ms", "application/x-ms-license"},
                        {".smd", "audio/x-smd"},
                        {".smi", "application/octet-stream"},
                        {".smx", "audio/x-smd"},
                        {".smz", "audio/x-smd"},
                        {".snd", "audio/basic"},
                        {".snippet", "application/xml"},
                        {".snp", "application/octet-stream"},
                        {".sol", "text/plain"},
                        {".sor", "text/plain"},
                        {".spc", "application/x-pkcs7-certificates"},
                        {".spl", "application/futuresplash"},
                        {".src", "application/x-wais-source"},
                        {".srf", "text/plain"},
                        {".SSISDeploymentManifest", "text/xml"},
                        {".ssm", "application/streamingmedia"},
                        {".sst", "application/vnd.ms-pki.certstore"},
                        {".stl", "application/vnd.ms-pki.stl"},
                        {".sv4cpio", "application/x-sv4cpio"},
                        {".sv4crc", "application/x-sv4crc"},
                        {".svc", "application/xml"},
                        {".swf", "application/x-shockwave-flash"},
                        {".t", "application/x-troff"},
                        {".tar", "application/x-tar"},
                        {".tcl", "application/x-tcl"},
                        {".testrunconfig", "application/xml"},
                        {".testsettings", "application/xml"},
                        {".tex", "application/x-tex"},
                        {".texi", "application/x-texinfo"},
                        {".texinfo", "application/x-texinfo"},
                        {".tgz", "application/x-compressed"},
                        {".thmx", "application/vnd.ms-officetheme"},
                        {".thn", "application/octet-stream"},
                        {".tif", "image/tiff"},
                        {".tiff", "image/tiff"},
                        {".tlh", "text/plain"},
                        {".tli", "text/plain"},
                        {".toc", "application/octet-stream"},
                        {".tr", "application/x-troff"},
                        {".trm", "application/x-msterminal"},
                        {".trx", "application/xml"},
                        {".ts", "video/vnd.dlna.mpeg-tts"},
                        {".tsv", "text/tab-separated-values"},
                        {".ttf", "application/octet-stream"},
                        {".tts", "video/vnd.dlna.mpeg-tts"},
                        {".txt", "text/plain"},
                        {".u32", "application/octet-stream"},
                        {".uls", "text/iuls"},
                        {".user", "text/plain"},
                        {".ustar", "application/x-ustar"},
                        {".vb", "text/plain"},
                        {".vbdproj", "text/plain"},
                        {".vbk", "video/mpeg"},
                        {".vbproj", "text/plain"},
                        {".vbs", "text/vbscript"},
                        {".vcf", "text/x-vcard"},
                        {".vcproj", "Application/xml"},
                        {".vcs", "text/plain"},
                        {".vcxproj", "Application/xml"},
                        {".vddproj", "text/plain"},
                        {".vdp", "text/plain"},
                        {".vdproj", "text/plain"},
                        {".vdx", "application/vnd.ms-visio.viewer"},
                        {".vml", "text/xml"},
                        {".vscontent", "application/xml"},
                        {".vsct", "text/xml"},
                        {".vsd", "application/vnd.visio"},
                        {".vsi", "application/ms-vsi"},
                        {".vsix", "application/vsix"},
                        {".vsixlangpack", "text/xml"},
                        {".vsixmanifest", "text/xml"},
                        {".vsmdi", "application/xml"},
                        {".vspscc", "text/plain"},
                        {".vss", "application/vnd.visio"},
                        {".vsscc", "text/plain"},
                        {".vssettings", "text/xml"},
                        {".vssscc", "text/plain"},
                        {".vst", "application/vnd.visio"},
                        {".vstemplate", "text/xml"},
                        {".vsto", "application/x-ms-vsto"},
                        {".vsw", "application/vnd.visio"},
                        {".vsx", "application/vnd.visio"},
                        {".vtx", "application/vnd.visio"},
                        {".wav", "audio/wav"},
                        {".wave", "audio/wav"},
                        {".wax", "audio/x-ms-wax"},
                        {".wbk", "application/msword"},
                        {".wbmp", "image/vnd.wap.wbmp"},
                        {".wcm", "application/vnd.ms-works"},
                        {".wdb", "application/vnd.ms-works"},
                        {".wdp", "image/vnd.ms-photo"},
                        {".webarchive", "application/x-safari-webarchive"},
                        {".webm", "video/webm"},
                        {".webtest", "application/xml"},
                        {".wiq", "application/xml"},
                        {".wiz", "application/msword"},
                        {".wks", "application/vnd.ms-works"},
                        {".WLMP", "application/wlmoviemaker"},
                        {".wlpginstall", "application/x-wlpg-detect"},
                        {".wlpginstall3", "application/x-wlpg3-detect"},
                        {".wm", "video/x-ms-wm"},
                        {".wma", "audio/x-ms-wma"},
                        {".wmd", "application/x-ms-wmd"},
                        {".wmf", "application/x-msmetafile"},
                        {".wml", "text/vnd.wap.wml"},
                        {".wmlc", "application/vnd.wap.wmlc"},
                        {".wmls", "text/vnd.wap.wmlscript"},
                        {".wmlsc", "application/vnd.wap.wmlscriptc"},
                        {".wmp", "video/x-ms-wmp"},
                        {".wmv", "video/x-ms-wmv"},
                        {".wmx", "video/x-ms-wmx"},
                        {".wmz", "application/x-ms-wmz"},
                        {".wpl", "application/vnd.ms-wpl"},
                        {".wps", "application/vnd.ms-works"},
                        {".wri", "application/x-mswrite"},
                        {".wrl", "x-world/x-vrml"},
                        {".wrz", "x-world/x-vrml"},
                        {".wsc", "text/scriptlet"},
                        {".wsdl", "text/xml"},
                        {".wvx", "video/x-ms-wvx"},
                        {".x", "application/directx"},
                        {".xaf", "x-world/x-vrml"},
                        {".xaml", "application/xaml+xml"},
                        {".xap", "application/x-silverlight-app"},
                        {".xbap", "application/x-ms-xbap"},
                        {".xbm", "image/x-xbitmap"},
                        {".xdr", "text/plain"},
                        {".xht", "application/xhtml+xml"},
                        {".xhtml", "application/xhtml+xml"},
                        {".xla", "application/vnd.ms-excel"},
                        {".xlam", "application/vnd.ms-excel.addin.macroEnabled.12"},
                        {".xlc", "application/vnd.ms-excel"},
                        {".xld", "application/vnd.ms-excel"},
                        {".xlk", "application/vnd.ms-excel"},
                        {".xll", "application/vnd.ms-excel"},
                        {".xlm", "application/vnd.ms-excel"},
                        {".xls", "application/vnd.ms-excel"},
                        {".xlsb", "application/vnd.ms-excel.sheet.binary.macroEnabled.12"},
                        {".xlsm", "application/vnd.ms-excel.sheet.macroEnabled.12"},
                        {".xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"},
                        {".xlt", "application/vnd.ms-excel"},
                        {".xltm", "application/vnd.ms-excel.template.macroEnabled.12"},
                        {".xltx", "application/vnd.openxmlformats-officedocument.spreadsheetml.template"},
                        {".xlw", "application/vnd.ms-excel"},
                        {".xml", "text/xml"},
                        {".xmta", "application/xml"},
                        {".xof", "x-world/x-vrml"},
                        {".XOML", "text/plain"},
                        {".xpm", "image/x-xpixmap"},
                        {".xps", "application/vnd.ms-xpsdocument"},
                        {".xrm-ms", "text/xml"},
                        {".xsc", "application/xml"},
                        {".xsd", "text/xml"},
                        {".xsf", "text/xml"},
                        {".xsl", "text/xml"},
                        {".xslt", "text/xml"},
                        {".xsn", "application/octet-stream"},
                        {".xss", "application/xml"},
                        {".xtp", "application/octet-stream"},
                        {".xwd", "image/x-xwindowdump"},
                        {".z", "application/x-compress"},
                        {".zip", "application/x-zip-compressed"},

                        #endregion

                    };

            public static string GetMimeType(string extension)
            {
                if (extension == null)
                {
                    throw new ArgumentNullException("extension");
                }

                if (!extension.StartsWith("."))
                {
                    extension = "." + extension;
                }

                string mime;

                return _mappings.TryGetValue(extension, out mime) ? mime : "application/octet-stream";
            }
        }

        //----------------------------------------------------------------
    }
}
