using CefSharp;
using TweetDuck.Browser.Handling.Filters;
using TweetDuck.Utils;
using TweetLib.Core.Features.Twitter;

namespace TweetDuck.Browser.Handling{
    class ResourceRequestHandlerBrowser : ResourceRequestHandlerBase{
        private const string UrlVendorResource = "/dist/vendor";
        private const string UrlLoadingSpinner = "/backgrounds/spinner_blue";

        protected override CefReturnValue OnBeforeResourceLoad(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IRequestCallback callback){
            if (request.ResourceType == ResourceType.MainFrame){
                if (request.Url.EndsWith("//twitter.com/")){
                    request.Url = TwitterUrls.TweetDeck; // redirect plain twitter.com requests, fixes bugs with login 2FA
                }
            }
            else if (request.ResourceType == ResourceType.Image){
                if (request.Url.Contains(UrlLoadingSpinner)){
                    request.Url = TwitterUtils.LoadingSpinner.Url;
                }
            }
            else if (request.ResourceType == ResourceType.Script){
                string url = request.Url;

                if (url.Contains("analytics.")){
                    callback.Dispose();
                    return CefReturnValue.Cancel;
                }
                else if (url.Contains(UrlVendorResource)){
                    request.SetHeaderByName("Accept-Encoding", "identity", overwrite: true);
                }
            }

            return base.OnBeforeResourceLoad(browserControl, browser, frame, request, callback);
        }

        protected override IResponseFilter GetResourceResponseFilter(IWebBrowser browserControl, IBrowser browser, IFrame frame, IRequest request, IResponse response){
            if (request.ResourceType == ResourceType.Script && request.Url.Contains(UrlVendorResource) && int.TryParse(response.Headers["Content-Length"], out int totalBytes)){
                return new ResponseFilterVendor(totalBytes);
            }

            return base.GetResourceResponseFilter(browserControl, browser, frame, request, response);
        }
    }
}