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

#ifndef CHROME_BROWSER_ASH_BOCA_BOCA_MANAGER_H_
#define CHROME_BROWSER_ASH_BOCA_BOCA_MANAGER_H_

#include <memory>

#include "chrome/browser/ash/boca/boca_app_client_impl.h"
#include "chromeos/ash/components/boca/babelorca/babel_orca_manager.h"
#include "chromeos/ash/components/boca/babelorca/soda_installer.h"
#include "chromeos/ash/components/boca/boca_metrics_manager.h"
#include "chromeos/ash/components/boca/boca_session_manager.h"
#include "chromeos/ash/components/boca/invalidations/invalidation_service_impl.h"
#include "chromeos/ash/components/boca/on_task/on_task_session_manager.h"
#include "chromeos/ash/components/boca/session_api/session_client_impl.h"
#include "chromeos/ash/components/boca/spotlight/spotlight_session_manager.h"
#include "components/keyed_service/core/keyed_service.h"
#include "components/prefs/pref_service.h"

class Profile;

namespace user_manager {
class User;
}  // namespace user_manager

namespace ash {

namespace boca {
class GeminiStatusFetcher;
}

// Manages boca main business logic.
class BocaManager : public KeyedService {
 public:
  // Constructor used only in test
  BocaManager(
      std::unique_ptr<boca::OnTaskSessionManager> on_task_session_manager,
      std::unique_ptr<boca::SessionClientImpl> session_client_impl,
      std::unique_ptr<boca::BocaSessionManager> boca_session_manager,
      std::unique_ptr<boca::InvalidationServiceImpl> invalidation_service_impl,
      std::unique_ptr<boca::BabelOrcaManager> babel_orca_manager,
      std::unique_ptr<boca::BocaMetricsManager> boca_metrics_manager,
      std::unique_ptr<boca::SpotlightSessionManager> spotlight_session_manager,
      Profile* profile);

  BocaManager(Profile* profile,
              PrefService* global_prefs,
              const std::string& application_locale);
  ~BocaManager() override;

  // KeyedService:
  void Shutdown() override;

  std::unique_ptr<boca::GeminiStatusFetcher> GetGeminiStatusFetcher();

  boca::BocaSessionManager* GetBocaSessionManager() {
    return boca_session_manager_.get();
  }

  boca::OnTaskSessionManager* GetOnTaskSessionManager() {
    return on_task_session_manager_.get();
  }
  boca::BabelOrcaManager* GetBabelOrcaManagerForTesting() {
    return babel_orca_manager_.get();
  }

  boca::BocaMetricsManager* GetBocaMetricsManagerForTesting() {
    return boca_metrics_manager_.get();
  }

  boca::SpotlightSessionManager* GetSpotlightSessionManagerForTesting() {
    return spotlight_session_manager_.get();
  }

 private:
  void AddObservers(const user_manager::User* user);

  std::unique_ptr<babelorca::SodaInstaller> soda_installer_;
  std::unique_ptr<boca::SessionClientImpl> session_client_impl_;
  std::unique_ptr<boca::BocaSessionManager> boca_session_manager_;
  std::unique_ptr<boca::OnTaskSessionManager> on_task_session_manager_;
  std::unique_ptr<boca::InvalidationServiceImpl> invalidation_service_impl_;
  std::unique_ptr<boca::BabelOrcaManager> babel_orca_manager_;
  std::unique_ptr<boca::BocaMetricsManager> boca_metrics_manager_;
  std::unique_ptr<boca::SpotlightSessionManager> spotlight_session_manager_;
  const raw_ptr<Profile> profile_;
};
}  // namespace ash

#endif  // CHROME_BROWSER_ASH_BOCA_BOCA_MANAGER_H_
