using System;
using System.IO;
using CefSharp;
using CefSharp.Callback;
using TweetLib.Browser.CEF.Data;
using TweetLib.Browser.CEF.Logic;

namespace TweetDuck.Browser.Base {
	sealed class CefByteArrayResourceHandler : IResourceHandler {
		private static readonly ByteArrayResourceHandlerLogic<IResponse>.WriteToOut<Stream> WriteToOut = delegate (Stream dataOut, byte[] dataIn, int position, int length) {
			dataOut.Write(dataIn, position, length);
		};

		private ByteArrayResourceHandlerLogic<IResponse> logic;

		public CefByteArrayResourceHandler() {
			SetResource(new ByteArrayResource(Array.Empty<byte>()));
		}

		public CefByteArrayResourceHandler(ByteArrayResource resource) {
			SetResource(resource);
		}

		public void SetResource(ByteArrayResource resource) {
			this.logic = new ByteArrayResourceHandlerLogic<IResponse>(resource, CefResponseAdapter.Instance);
		}

		bool IResourceHandler.Open(IRequest request, out bool handleRequest, ICallback callback) {
			return logic.Open(out handleRequest);
		}

		void IResourceHandler.GetResponseHeaders(IResponse response, out long responseLength, out string redirectUrl) {
			logic.GetResponseHeaders(response, out responseLength, out redirectUrl);
		}

		bool IResourceHandler.Skip(long bytesToSkip, out long bytesSkipped, IResourceSkipCallback callback) {
			return logic.Skip(bytesToSkip, out bytesSkipped, callback);
		}

		bool IResourceHandler.Read(Stream dataOut, out int bytesRead, IResourceReadCallback callback) {
			return logic.Read(WriteToOut, dataOut, out bytesRead, callback);
		}

		bool IResourceHandler.ProcessRequest(IRequest request, ICallback callback) {
			throw new NotSupportedException();
		}

		bool IResourceHandler.ReadResponse(Stream dataOut, out int bytesRead, ICallback callback) {
			throw new NotSupportedException();
		}

		void IResourceHandler.Cancel() {}
		void IDisposable.Dispose() {}
	}
}