/**
 * @fileOverview This module provides functionality for determining the MIME type for a
 * given file extension.
 *
 * @example >> const mime = require('ringo/mime');
 * >> mime.mimeType('photo.jpg');
 * 'image/jpeg'
 * >> mime.mimeType('video.m4v');
 * 'video/mp4'
 * >> mime.mimeType('feed.rss');
 * 'application/rss+xml'
 */

// Stolen from Jack with slight adaptions

/**
 * Determines the MIME type for the given file extension. If the file extension
 * is unknown, the fallback argument is returned. If that is undefined, the
 * function returns "application/octet-stream".
 * @param {String} fileName a file name
 * @param {String} fallback MIME type to return if file extension is unknown
 * @returns {String} the MIME type for the file name
 */
exports.mimeType = (fileName, fallback) => {
    const ext = fileName.slice(fileName.lastIndexOf('.')).toLowerCase();
    return exports.MIME_TYPES[ext] || fallback || 'application/octet-stream';
};

/**
 * A list of common MIME types, keyed by file extension.
 * @type Object
 */
exports.MIME_TYPES = {
    ".3gp"     : "video/3gpp",
    ".a"       : "application/octet-stream",
    ".ai"      : "application/postscript",
    ".aif"     : "audio/x-aiff",
    ".aiff"    : "audio/x-aiff",
    ".asc"     : "application/pgp-signature",
    ".asf"     : "video/x-ms-asf",
    ".asm"     : "text/x-asm",
    ".asx"     : "video/x-ms-asf",
    ".atom"    : "application/atom+xml",
    ".au"      : "audio/basic",
    ".avi"     : "video/x-msvideo",
    ".bat"     : "application/x-msdownload",
    ".bin"     : "application/octet-stream",
    ".bmp"     : "image/bmp",
    ".bz2"     : "application/x-bzip2",
    ".c"       : "text/x-c",
    ".cab"     : "application/vnd.ms-cab-compressed",
    ".cc"      : "text/x-c",
    ".chm"     : "application/vnd.ms-htmlhelp",
    ".class"   : "application/octet-stream",
    ".com"     : "application/x-msdownload",
    ".conf"    : "text/plain",
    ".cpp"     : "text/x-c",
    ".crt"     : "application/x-x509-ca-cert",
    ".css"     : "text/css",
    ".csv"     : "text/csv",
    ".cxx"     : "text/x-c",
    ".deb"     : "application/x-debian-package",
    ".der"     : "application/x-x509-ca-cert",
    ".diff"    : "text/x-diff",
    ".djv"     : "image/vnd.djvu",
    ".djvu"    : "image/vnd.djvu",
    ".dll"     : "application/x-msdownload",
    ".dmg"     : "application/x-apple-diskimage",
    ".doc"     : "application/msword",
    ".docm"    : "application/vnd.ms-word.template.macroEnabled.12",
    ".docx"    : "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
    ".dot"     : "application/msword",
    ".dotx"    : "application/vnd.openxmlformats-officedocument.wordprocessingml.template",
    ".dtd"     : "application/xml-dtd",
    ".dvi"     : "application/x-dvi",
    ".ear"     : "application/java-archive",
    ".eml"     : "message/rfc822",
    ".eps"     : "application/postscript",
    ".es"      : "application/ecmascript",
    ".exe"     : "application/x-msdownload",
    ".f"       : "text/x-fortran",
    ".f77"     : "text/x-fortran",
    ".f90"     : "text/x-fortran",
    ".flv"     : "video/x-flv",
    ".for"     : "text/x-fortran",
    ".gem"     : "application/octet-stream",
    ".gemspec" : "text/x-script.ruby",
    ".gif"     : "image/gif",
    ".gz"      : "application/x-gzip",
    ".h"       : "text/x-c",
    ".hh"      : "text/x-c",
    ".htm"     : "text/html",
    ".html"    : "text/html",
    ".hqx"     : "application/mac-binhex40",
    ".ico"     : "image/vnd.microsoft.icon",
    ".ics"     : "text/calendar",
    ".ifb"     : "text/calendar",
    ".iso"     : "application/octet-stream",
    ".jar"     : "application/java-archive",
    ".java"    : "text/x-java-source",
    ".jnlp"    : "application/x-java-jnlp-file",
    ".jpeg"    : "image/jpeg",
    ".jpg"     : "image/jpeg",
    ".js"      : "application/javascript",
    ".json"    : "application/json",
    ".log"     : "text/plain",
    ".m3u"     : "audio/x-mpegurl",
    ".m4v"     : "video/mp4",
    ".man"     : "text/troff",
    ".manifest": "text/cache-manifest",
    ".mathml"  : "application/mathml+xml",
    ".mbox"    : "application/mbox",
    ".mdb"     : "application/msaccess",
    ".mdoc"    : "text/troff",
    ".me"      : "text/troff",
    ".mid"     : "audio/midi",
    ".midi"    : "audio/midi",
    ".mime"    : "message/rfc822",
    ".mml"     : "application/mathml+xml",
    ".mng"     : "video/x-mng",
    ".mov"     : "video/quicktime",
    ".mp3"     : "audio/mpeg",
    ".mp4"     : "video/mp4",
    ".mp4v"    : "video/mp4",
    ".mpeg"    : "video/mpeg",
    ".mpg"     : "video/mpeg",
    ".ms"      : "text/troff",
    ".msi"     : "application/x-msdownload",
    ".odb"     : "application/vnd.oasis.opendocument.database",
    ".odc"     : "application/vnd.oasis.opendocument.chart",
    ".odf"     : "application/vnd.oasis.opendocument.formula",
    ".odg"     : "application/vnd.oasis.opendocument.graphics",
    ".odi"     : "application/vnd.oasis.opendocument.image",
    ".odm"     : "application/vnd.oasis.opendocument.text-master",
    ".odp"     : "application/vnd.oasis.opendocument.presentation",
    ".ods"     : "application/vnd.oasis.opendocument.spreadsheet",
    ".odt"     : "application/vnd.oasis.opendocument.text",
    ".ogg"     : "application/ogg",
    ".ogx"     : "application/ogg",
    ".otg"     : "application/vnd.oasis.opendocument.graphics-template",
    ".oth"     : "application/vnd.oasis.opendocument.text-web",
    ".otp"     : "application/vnd.oasis.opendocument.presentation-template",
    ".ots"     : "application/vnd.oasis.opendocument.spreadsheet-template",
    ".ott"     : "application/vnd.oasis.opendocument.text-template",
    ".p"       : "text/x-pascal",
    ".pas"     : "text/x-pascal",
    ".pbm"     : "image/x-portable-bitmap",
    ".pdf"     : "application/pdf",
    ".pem"     : "application/x-x509-ca-cert",
    ".pgm"     : "image/x-portable-graymap",
    ".pgp"     : "application/pgp-encrypted",
    ".pkg"     : "application/octet-stream",
    ".pl"      : "text/x-script.perl",
    ".pm"      : "text/x-script.perl-module",
    ".png"     : "image/png",
    ".pnm"     : "image/x-portable-anymap",
    ".potx"    : "application/vnd.openxmlformats-officedocument.presentationml.template",
    ".ppm"     : "image/x-portable-pixmap",
    ".pps"     : "application/vnd.ms-powerpoint",
    ".ppsx"    : "application/vnd.openxmlformats-officedocument.presentationml.slideshow",
    ".ppt"     : "application/vnd.ms-powerpoint",
    ".pptx"    : "application/vnd.openxmlformats-officedocument.presentationml.presentation",
    ".ps"      : "application/postscript",
    ".psd"     : "image/vnd.adobe.photoshop",
    ".py"      : "text/x-script.python",
    ".qt"      : "video/quicktime",
    ".ra"      : "audio/x-pn-realaudio",
    ".rake"    : "text/x-script.ruby",
    ".ram"     : "audio/x-pn-realaudio",
    ".rar"     : "application/x-rar-compressed",
    ".rb"      : "text/x-script.ruby",
    ".rdf"     : "application/rdf+xml",
    ".roff"    : "text/troff",
    ".rpm"     : "application/x-redhat-package-manager",
    ".rss"     : "application/rss+xml",
    ".rtf"     : "application/rtf",
    ".ru"      : "text/x-script.ruby",
    ".s"       : "text/x-asm",
    ".sgm"     : "text/sgml",
    ".sgml"    : "text/sgml",
    ".sh"      : "application/x-sh",
    ".sig"     : "application/pgp-signature",
    ".sit"     : "application/x-stuffit",
    ".snd"     : "audio/basic",
    ".sldx"    : "application/vnd.openxmlformats-officedocument.presentationml.slide",
    ".so"      : "application/octet-stream",
    ".svg"     : "image/svg+xml",
    ".svgz"    : "image/svg+xml",
    ".swf"     : "application/x-shockwave-flash",
    ".t"       : "text/troff",
    ".tar"     : "application/x-tar",
    ".tbz"     : "application/x-bzip-compressed-tar",
    ".tcl"     : "application/x-tcl",
    ".tex"     : "application/x-tex",
    ".texi"    : "application/x-texinfo",
    ".texinfo" : "application/x-texinfo",
    ".text"    : "text/plain",
    ".tgz"     : "application/x-tar",
    ".tif"     : "image/tiff",
    ".tiff"    : "image/tiff",
    ".torrent" : "application/x-bittorrent",
    ".tr"      : "text/troff",
    ".txt"     : "text/plain",
    ".vcf"     : "text/x-vcard",
    ".vcs"     : "text/x-vcalendar",
    ".vrml"    : "model/vrml",
    ".war"     : "application/java-archive",
    ".wav"     : "audio/x-wav",
    ".wma"     : "audio/x-ms-wma",
    ".wmv"     : "video/x-ms-wmv",
    ".wmx"     : "video/x-ms-wmx",
    ".wrl"     : "model/vrml",
    ".wsdl"    : "application/wsdl+xml",
    ".xbm"     : "image/x-xbitmap",
    ".xhtml"   : "application/xhtml+xml",
    ".xlam"    : "application/vnd.ms-excel.addin.macroEnabled.12",
    ".xls"     : "application/vnd.ms-excel",
    ".xlsb"    : "application/vnd.ms-excel.sheet.binary.macroEnabled.12",
    ".xlsx"    : "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
    ".xltx"    : "application/vnd.openxmlformats-officedocument.spreadsheetml.template",
    ".xml"     : "application/xml",
    ".xpm"     : "image/x-xpixmap",
    ".xps"     : "application/vnd.ms-xpsdocument",
    ".xsl"     : "application/xml",
    ".xslt"    : "application/xslt+xml",
    ".yaml"    : "text/yaml",
    ".yml"     : "text/yaml",
    ".zip"     : "application/zip"
};
