using System.Collections.Generic;
using System.Text.RegularExpressions;
namespace Masuit.Tools.AspNetCore.Mime
{
    /// 
    /// 默认MIME映射器,可以根据文件扩展名获取标准内容类型。
    /// 
    public class MimeMapper : IMimeMapper
    {
        /// 
        /// 默认Mime  - 如果没有找到任何其他映射则作为默认的Mime-Type
        /// 
        public const string DefaultMime = "application/octet-stream";
        /// 
        /// 在文件路径中搜索文件扩展名的默认正则表达式
        /// 
        private readonly Regex _pathExtensionPattern = new Regex("\\.(\\w*)$");
        /// 
        /// Mime类型与扩展名的映射字典(扩展名:mimetype)
        /// 
        public static Dictionary MimeTypes { get; } = new Dictionary();
        /// 
        /// mime类型与扩展名的映射关系(mimetype:扩展名)
        /// 
        public static Dictionary ExtTypes { get; } = new Dictionary();
        static MimeMapper()
        {
            foreach (var item in DefaultMimeItems.Items)
            {
                MimeTypes["." + item.Extension] = item.MimeType;
                ExtTypes[item.MimeType] = "." + item.Extension;
            }
        }
        /// 
        /// 
        /// 
        public MimeMapper() : this(null)
        {
        }
        /// 
        /// 
        /// 
        /// 
        public MimeMapper(params MimeMappingItem[] extensions)
        {
            Extend(extensions);
        }
        /// 
        /// 扩展mime映射规则的标准列表。扩展的具有更高的优先级 - 如果扩展具有与标准项相同的扩展名,则会覆盖默认的mime
        /// 
        /// 
        /// 
        public IMimeMapper Extend(params MimeMappingItem[] extensions)
        {
            if (extensions != null)
            {
                foreach (var mapping in extensions)
                {
                    MimeTypes[mapping.Extension] = mapping.MimeType;
                    ExtTypes[mapping.MimeType] = mapping.Extension;
                }
            }
            return this;
        }
        /// 
        /// 返回特定文件扩展名的Content-Type,如果未找到任何对应关系,则返回默认值
        /// 
        /// 
        /// 
        public string GetMimeFromExtension(string fileExtension)
        {
            fileExtension = (fileExtension ?? string.Empty).ToLower();
            return MimeTypes.ContainsKey(fileExtension) ? MimeTypes[fileExtension] : DefaultMime;
        }
        /// 
        /// 返回特定Content-Type的文件扩展名,如果未找到任何对应关系,则返回空值
        /// 
        /// 
        /// 
        public string GetExtensionFromMime(string mime)
        {
            mime = (mime ?? string.Empty).ToLower();
            return ExtTypes.ContainsKey(mime) ? ExtTypes[mime] : "";
        }
        /// 
        /// 根据路径获取MimeType
        /// 
        /// 
        /// 
        public string GetMimeFromPath(string path)
        {
            var extension = GetExtension(path);
            return GetMimeFromExtension(extension);
        }
        /// 
        /// 获取扩展名
        /// 
        /// 
        /// 
        protected string GetExtension(string path)
        {
            var match = _pathExtensionPattern.Match(path ?? string.Empty);
            if (match.Groups.Count > 1)
            {
                return match.Groups[1].Value;
            }
            return null;
        }
    }
}