// Copyright 2018 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef COMPONENTS_SYNC_SESSIONS_SESSION_SYNC_SERVICE_IMPL_H_
#define COMPONENTS_SYNC_SESSIONS_SESSION_SYNC_SERVICE_IMPL_H_

#include <memory>
#include <string>

#include "base/callback_list.h"
#include "base/memory/weak_ptr.h"
#include "components/sync/model/model_type_store.h"
#include "components/sync_sessions/session_sync_service.h"
#include "components/version_info/channel.h"

namespace sync_sessions {

class SessionSyncBridge;
class SyncSessionsClient;

// Single non-test implementation of SessionSyncService.
class SessionSyncServiceImpl : public SessionSyncService {
 public:
  SessionSyncServiceImpl(version_info::Channel channel,
                         std::unique_ptr<SyncSessionsClient> sessions_client);
  ~SessionSyncServiceImpl() override;

  syncer::GlobalIdMapper* GetGlobalIdMapper() const override;

  // Return the active OpenTabsUIDelegate. If open/proxy tabs is not enabled or
  // not currently syncing, returns nullptr.
  OpenTabsUIDelegate* GetOpenTabsUIDelegate() override;

  // Allows client code to be notified when foreign sessions change.
  std::unique_ptr<base::CallbackList<void()>::Subscription>
  SubscribeToForeignSessionsChanged(const base::RepeatingClosure& cb) override
      WARN_UNUSED_RESULT;

  // For ProfileSyncService to initialize the controller for SESSIONS.
  base::WeakPtr<syncer::ModelTypeControllerDelegate> GetControllerDelegate()
      override;

  // For ProfileSyncService to initialize the controller for FAVICON_IMAGES and
  // FAVICON_TRACKING.
  FaviconCache* GetFaviconCache() override;

  // Intended to be used by ProxyDataTypeController: influences whether
  // GetOpenTabsUIDelegate() returns null or not.
  void ProxyTabsStateChanged(syncer::DataTypeController::State state) override;

  // Used on Android only, to override the machine tag.
  void SetSyncSessionsGUID(const std::string& guid) override;

  // Returns OpenTabsUIDelegate regardless of sync being enabled or disabled,
  // useful for tests.
  OpenTabsUIDelegate* GetUnderlyingOpenTabsUIDelegateForTest();

 private:
  void NotifyForeignSessionUpdated();

  std::unique_ptr<SyncSessionsClient> sessions_client_;

  bool proxy_tabs_running_ = false;

  std::unique_ptr<SessionSyncBridge> bridge_;

  base::CallbackList<void()> foreign_sessions_changed_callback_list_;

  DISALLOW_COPY_AND_ASSIGN(SessionSyncServiceImpl);
};

}  // namespace sync_sessions

#endif  // COMPONENTS_SYNC_SESSIONS_SESSION_SYNC_SERVICE_IMPL_H_
