using System;
using System.Collections.Concurrent;
using CefSharp;

namespace TweetDuck.Browser.Data{
    sealed class ResourceHandlers{
        private readonly ConcurrentDictionary<string, IResourceHandler> handlers = new ConcurrentDictionary<string, IResourceHandler>(StringComparer.OrdinalIgnoreCase);

        public bool HasHandler(IRequest request){
            return handlers.ContainsKey(request.Url);
        }

        public IResourceHandler GetHandler(IRequest request){
            return handlers.TryGetValue(request.Url, out var handler) ? handler : null;
        }

        public bool Register(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 Register(ResourceLink link){
            return Register(link.Url, link.Handler);
        }

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

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