using System.IO;
using System.Net;
using System.Text;
using CefSharp;
using TweetLib.Core.Browser;
using TweetLib.Core.Features.Plugins;

namespace TweetDuck.Plugins{
    sealed class PluginSchemeFactory : ISchemeHandlerFactory{
        public const string Name = PluginSchemeHandler<IResourceHandler>.Name;

        private readonly PluginSchemeHandler<IResourceHandler> handler = new PluginSchemeHandler<IResourceHandler>(new ResourceProvider());

        internal void Setup(PluginManager plugins){
            handler.Setup(plugins);
        }

        public IResourceHandler Create(IBrowser browser, IFrame frame, string schemeName, IRequest request){
            return handler.Process(request.Url);
        }

        private sealed class ResourceProvider : IResourceProvider<IResourceHandler>{
            private static ResourceHandler CreateHandler(byte[] bytes){
                var handler = ResourceHandler.FromStream(new MemoryStream(bytes), autoDisposeStream: true);
                handler.Headers.Set("Access-Control-Allow-Origin", "*");
                return handler;
            }

            public IResourceHandler Status(HttpStatusCode code, string message){
                var handler = CreateHandler(Encoding.UTF8.GetBytes(message));
                handler.StatusCode = (int)code;
                return handler;
            }

            public IResourceHandler File(byte[] bytes, string extension){
                if (bytes.Length == 0){
                    return Status(HttpStatusCode.NoContent, "File is empty."); // FromByteArray crashes CEF internals with no contents
                }
                else{
                    var handler = CreateHandler(bytes);
                    handler.MimeType = Cef.GetMimeType(extension);
                    return handler;
                }
            }
        }
    }
}