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

namespace TweetDuck.Browser.Data {
	sealed class ResourceHandlers {
		private readonly ConcurrentDictionary<string, Func<IResourceHandler>> handlers = new ConcurrentDictionary<string, Func<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 factory) ? factory() : null;
		}

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

			return false;
		}

		public bool Register(ResourceLink link) {
			return Register(link.Url, link.Factory);
		}

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

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

		public static Func<IResourceHandler> ForString(string str) {
			return () => ResourceHandler.FromString(str);
		}

		public static Func<IResourceHandler> ForString(string str, string mimeType) {
			return () => ResourceHandler.FromString(str, mimeType: mimeType);
		}

		public static Func<IResourceHandler> ForBytes(byte[] bytes, string mimeType) {
			return () => ResourceHandler.FromByteArray(bytes, mimeType);
		}
	}
}