using System;
using System.Collections.Concurrent;
using CefSharp;
using TweetDuck.Data;

namespace TweetDuck.Core.Handling{
    sealed class ResourceHandlerFactory : IResourceHandlerFactory{
        public bool HasHandlers => !handlers.IsEmpty;

        private readonly ConcurrentDictionary<string, IResourceHandler> handlers = new ConcurrentDictionary<string, IResourceHandler>(StringComparer.OrdinalIgnoreCase);

        public IResourceHandler GetResourceHandler(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request){
            try{
                return handlers.TryGetValue(request.Url, out IResourceHandler handler) ? handler : null;
            }finally{
                request.Dispose();
            }
        }

        // registration

        public bool RegisterHandler(string url, IResourceHandler handler){
            if (Uri.TryCreate(url, UriKind.Absolute, out Uri uri)){
                handlers.AddOrUpdate(uri.AbsoluteUri, handler, (key, prev) => handler);
                return true;
            }

            return false;
        }

        public bool RegisterHandler(ResourceLink link){
            return RegisterHandler(link.Url, link.Handler);
        }

        public bool UnregisterHandler(string url){
            return handlers.TryRemove(url, out IResourceHandler _);
        }

        public bool UnregisterHandler(ResourceLink link){
            return UnregisterHandler(link.Url);
        }
    }
}