/*
 * Copyright (c) 2023, Andrew Kaster <akaster@serenityos.org>
 *
 * SPDX-License-Identifier: BSD-2-Clause
 */

#pragma once

#include <AK/ByteString.h>
#include <AK/Optional.h>
#include <AK/String.h>
#include <AK/Vector.h>
#include <LibURL/URL.h>
#include <LibWebView/ProcessType.h>

namespace WebView {

enum class HeadlessMode {
    Screenshot,
    LayoutTree,
    Text,
    Manual,
    Test,
};

enum class NewWindow {
    No,
    Yes,
};

enum class ForceNewProcess {
    No,
    Yes,
};

enum class AllowPopups {
    No,
    Yes,
};

enum class DisableScripting {
    No,
    Yes,
};

enum class DisableSQLDatabase {
    No,
    Yes,
};

enum class EnableAutoplay {
    No,
    Yes,
};

struct SystemDNS { };
struct DNSOverTLS {
    ByteString server_address;
    u16 port;
    bool validate_dnssec_locally;
};
struct DNSOverUDP {
    ByteString server_address;
    u16 port;
    bool validate_dnssec_locally;
};

using DNSSettings = Variant<SystemDNS, DNSOverTLS, DNSOverUDP>;

constexpr inline u16 default_devtools_port = 6000;

enum class EnableContentBlocker {
    No,
    Yes,
};

enum class EnableCompositorProcess {
    No,
    Yes,
};

struct BrowserOptions {
    Vector<URL::URL> urls;
    Vector<ByteString> raw_urls;
    Optional<HeadlessMode> headless_mode;
    u32 screenshot_delay { 1 };
    int window_width { 800 };
    int window_height { 600 };
    NewWindow new_window { NewWindow::No };
    ForceNewProcess force_new_process { ForceNewProcess::No };
    AllowPopups allow_popups { AllowPopups::No };
    DisableScripting disable_scripting { DisableScripting::No };
    DisableSQLDatabase disable_sql_database { DisableSQLDatabase::No };
    Vector<ProcessType> debug_helper_processes {};
    Optional<ProcessType> profile_helper_process {};
    Optional<ByteString> webdriver_endpoint {};
    Optional<DNSSettings> dns_settings {};
    Optional<u16> devtools_port;
    EnableContentBlocker enable_content_blocker { EnableContentBlocker::Yes };
    EnableCompositorProcess enable_compositor_process { EnableCompositorProcess::No };
    Vector<ByteString> content_blocker_list_paths {};
};

enum class HTTPDiskCacheMode {
    Disabled,
    Enabled,
    Partitioned,
    Testing,
};

struct RequestServerOptions {
    Vector<ByteString> certificates;
    HTTPDiskCacheMode http_disk_cache_mode { HTTPDiskCacheMode::Disabled };
    Optional<ByteString> resource_substitution_map_path;
};

enum class IsTestMode {
    No,
    Yes,
};

enum class LogAllJSExceptions {
    No,
    Yes,
};

enum class EnableIDLTracing {
    No,
    Yes,
};

enum class EnableMemoryHTTPCache {
    No,
    Yes,
};

enum class DisableSiteIsolation {
    No,
    Yes,
};

enum class ExposeExperimentalInterfaces {
    No,
    Yes,
};

enum class ExposeInternalsObject {
    No,
    Yes,
};

enum class ForceCPUPainting {
    No,
    Yes,
};

enum class ForceFontconfig {
    No,
    Yes,
};

enum class CollectGarbageOnEveryAllocation {
    No,
    Yes,
};

enum class PaintViewportScrollbars {
    Yes,
    No,
};

enum class EnableAsyncScrolling {
    No,
    Yes,
};

enum class FileSchemeUrlsHaveTupleOrigins {
    No,
    Yes,
};

struct WebContentOptions {
    Optional<ByteString> config_path {};
    Optional<StringView> user_agent_preset {};
    IsTestMode is_test_mode { IsTestMode::No };
    LogAllJSExceptions log_all_js_exceptions { LogAllJSExceptions::No };
    DisableSiteIsolation disable_site_isolation { DisableSiteIsolation::No };
    EnableIDLTracing enable_idl_tracing { EnableIDLTracing::No };
    EnableMemoryHTTPCache enable_http_memory_cache { EnableMemoryHTTPCache::No };
    ExposeExperimentalInterfaces expose_experimental_interfaces { ExposeExperimentalInterfaces::No };
    ExposeInternalsObject expose_internals_object { ExposeInternalsObject::No };
    ForceCPUPainting force_cpu_painting { ForceCPUPainting::No };
    ForceFontconfig force_fontconfig { ForceFontconfig::No };
    EnableAutoplay enable_autoplay { EnableAutoplay::No };
    CollectGarbageOnEveryAllocation collect_garbage_on_every_allocation { CollectGarbageOnEveryAllocation::No };
    Optional<u16> echo_server_port {};
    PaintViewportScrollbars paint_viewport_scrollbars { PaintViewportScrollbars::Yes };
    EnableAsyncScrolling enable_async_scrolling { EnableAsyncScrolling::Yes };
    FileSchemeUrlsHaveTupleOrigins file_scheme_urls_have_tuple_origins { FileSchemeUrlsHaveTupleOrigins::No };
    Optional<StringView> default_time_zone {};
    Optional<u64> style_invalidation_counter_dump_interval {};
};

}
