// Copyright 2022 The Cobalt Authors. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef COBALT_WEB_CONTEXT_H_
#define COBALT_WEB_CONTEXT_H_

#include <string>

#include "cobalt/loader/fetcher_factory.h"
#include "cobalt/loader/script_loader_factory.h"
#include "cobalt/network/network_module.h"
#include "cobalt/script/environment_settings.h"
#include "cobalt/script/execution_state.h"
#include "cobalt/script/global_environment.h"
#include "cobalt/script/javascript_engine.h"
#include "cobalt/script/script_runner.h"
#include "cobalt/script/wrappable.h"
#include "cobalt/web/blob.h"
#include "cobalt/web/environment_settings.h"
#include "cobalt/web/user_agent_platform_info.h"

namespace cobalt {
namespace worker {
class ServiceWorkerRegistration;
class ServiceWorkerRegistrationObject;
class ServiceWorker;
class ServiceWorkerJobs;
class ServiceWorkerObject;
}  // namespace worker
namespace web {
class WindowOrWorkerGlobalScope;

class Context {
 public:
  virtual ~Context() {}
  virtual base::MessageLoop* message_loop() const = 0;
  virtual void ShutDownJavaScriptEngine() = 0;
  virtual void set_fetcher_factory(loader::FetcherFactory* factory) = 0;
  virtual loader::FetcherFactory* fetcher_factory() const = 0;
  virtual loader::ScriptLoaderFactory* script_loader_factory() const = 0;
  virtual script::JavaScriptEngine* javascript_engine() const = 0;
  virtual script::GlobalEnvironment* global_environment() const = 0;
  virtual script::ExecutionState* execution_state() const = 0;
  virtual script::ScriptRunner* script_runner() const = 0;
  virtual Blob::Registry* blob_registry() const = 0;
  virtual network::NetworkModule* network_module() const = 0;
  virtual worker::ServiceWorkerJobs* service_worker_jobs() const = 0;

  virtual const std::string& name() const = 0;
  virtual void setup_environment_settings(EnvironmentSettings* settings) = 0;
  virtual EnvironmentSettings* environment_settings() const = 0;

  virtual scoped_refptr<worker::ServiceWorkerRegistration>
  LookupServiceWorkerRegistration(
      worker::ServiceWorkerRegistrationObject* registration) = 0;
  // https://w3c.github.io/ServiceWorker/#get-the-service-worker-registration-object
  virtual scoped_refptr<worker::ServiceWorkerRegistration>
  GetServiceWorkerRegistration(
      worker::ServiceWorkerRegistrationObject* registration) = 0;

  virtual void RemoveServiceWorker(worker::ServiceWorkerObject* worker) = 0;
  virtual scoped_refptr<worker::ServiceWorker> LookupServiceWorker(
      worker::ServiceWorkerObject* worker) = 0;
  // https://w3c.github.io/ServiceWorker/#get-the-service-worker-object
  virtual scoped_refptr<worker::ServiceWorker> GetServiceWorker(
      worker::ServiceWorkerObject* worker) = 0;

  virtual WindowOrWorkerGlobalScope* GetWindowOrWorkerGlobalScope() = 0;

  virtual UserAgentPlatformInfo* platform_info() const = 0;

  virtual std::string GetUserAgent() const = 0;
  virtual std::string GetPreferredLanguage() const = 0;

  // https://w3c.github.io/ServiceWorker/#dfn-control
  virtual bool is_controlled_by(worker::ServiceWorkerObject* worker) const = 0;

  // https://html.spec.whatwg.org/multipage/webappapis.html#concept-environment-active-service-worker
  virtual void set_active_service_worker(
      const scoped_refptr<worker::ServiceWorkerObject>& worker) = 0;
  virtual scoped_refptr<worker::ServiceWorkerObject>&
  active_service_worker() = 0;
  virtual const scoped_refptr<worker::ServiceWorkerObject>&
  active_service_worker() const = 0;
};

}  // namespace web
}  // namespace cobalt

#endif  // COBALT_WEB_CONTEXT_H_
