// Copyright 2015 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.

#include "components/arc/arc_service_manager.h"

#include <utility>

#include "base/sequenced_task_runner.h"
#include "base/thread_task_runner_handle.h"
#include "components/arc/arc_bridge_bootstrap.h"
#include "components/arc/arc_bridge_service_impl.h"
#include "components/arc/auth/arc_auth_service.h"
#include "components/arc/clipboard/arc_clipboard_bridge.h"
#include "components/arc/ime/arc_ime_bridge.h"
#include "components/arc/input/arc_input_bridge.h"
#include "components/arc/power/arc_power_bridge.h"
#include "components/arc/settings/arc_settings_bridge.h"
#include "components/arc/video/arc_video_bridge.h"
#include "ui/arc/notification/arc_notification_manager.h"

namespace arc {

namespace {

// Weak pointer.  This class is owned by ChromeBrowserMainPartsChromeos.
ArcServiceManager* g_arc_service_manager = nullptr;

}  // namespace

ArcServiceManager::ArcServiceManager(
    scoped_ptr<ArcAuthService> auth_service,
    scoped_ptr<ArcSettingsBridge> settings_bridge,
    scoped_ptr<ArcVideoBridge> video_bridge)
    : arc_bridge_service_(
          new ArcBridgeServiceImpl(ArcBridgeBootstrap::Create())),
      arc_auth_service_(std::move(auth_service)),
      arc_clipboard_bridge_(new ArcClipboardBridge(arc_bridge_service_.get())),
      arc_ime_bridge_(new ArcImeBridge(arc_bridge_service_.get())),
      arc_input_bridge_(ArcInputBridge::Create(arc_bridge_service_.get())),
      arc_settings_bridge_(std::move(settings_bridge)),
      arc_power_bridge_(new ArcPowerBridge(arc_bridge_service_.get())),
      arc_video_bridge_(std::move(video_bridge)) {
  DCHECK(!g_arc_service_manager);
  g_arc_service_manager = this;

  arc_settings_bridge_->StartObservingBridgeServiceChanges();
  arc_auth_service_->StartObservingBridgeServiceChanges();
  arc_video_bridge_->StartObservingBridgeServiceChanges();
}

ArcServiceManager::~ArcServiceManager() {
  DCHECK(thread_checker_.CalledOnValidThread());
  DCHECK(g_arc_service_manager == this);
  g_arc_service_manager = nullptr;
}

// static
ArcServiceManager* ArcServiceManager::Get() {
  DCHECK(g_arc_service_manager);
  DCHECK(g_arc_service_manager->thread_checker_.CalledOnValidThread());
  return g_arc_service_manager;
}

ArcBridgeService* ArcServiceManager::arc_bridge_service() {
  DCHECK(thread_checker_.CalledOnValidThread());
  return arc_bridge_service_.get();
}

void ArcServiceManager::OnPrimaryUserProfilePrepared(
    const AccountId& account_id) {
  DCHECK(thread_checker_.CalledOnValidThread());

  arc_notification_manager_.reset(
      new ArcNotificationManager(arc_bridge_service(), account_id));
}

}  // namespace arc