// Copyright 2021 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 ASH_HUD_DISPLAY_ASH_TRACING_MANAGER_H_
#define ASH_HUD_DISPLAY_ASH_TRACING_MANAGER_H_

#include <memory>

#include "ash/hud_display/ash_tracing_request.h"
#include "ash/public/cpp/session/session_observer.h"
#include "base/memory/weak_ptr.h"
#include "base/observer_list.h"
#include "base/observer_list_types.h"

namespace ash {
namespace hud_display {

// Singleton object to manager Ash tracing sessions.
class ASH_EXPORT AshTracingManager : public SessionObserver {
 public:
  class Observer : public base::CheckedObserver {
   public:
    Observer() = default;
    ~Observer() override = default;

    virtual void OnTracingStatusChange() = 0;
  };

  AshTracingManager();
  AshTracingManager(const AshTracingManager&) = delete;
  AshTracingManager& operator=(const AshTracingManager&) = delete;
  ~AshTracingManager() override;

  static AshTracingManager& Get();

  // True when tracing is being started or stopped. No control requests are
  // possible.
  bool IsBusy() const;

  // True when tracing can be stopped.
  bool IsTracingStarted() const;

  // Returns user status message.
  std::string GetStatusMessage() const;

  // Initiates asynchronous tracing start. Observer will be notified with the
  // result.
  void Start();

  // Initiates asynchronous tracing stop. Observer will be notified with the
  // result.
  void Stop();

  void AddObserver(Observer* observer);
  void RemoveObserver(Observer* observer);

  // Called by AshTracingRequest to update system state.
  void OnRequestStatusChanged(AshTracingRequest* request);

  // SessionObserver
  void OnFirstSessionStarted() override;

  const std::vector<std::unique_ptr<AshTracingRequest>>&
  GetTracingRequestsForTesting() const;

 private:
  // Returns status of the last request in tracing_requests_.
  AshTracingRequest::Status GetLastRequestStatus() const;

  // Only last tracing request can be active. Other can be either finished, or
  // waiting for user session start to save the trace.
  std::vector<std::unique_ptr<AshTracingRequest>> tracing_requests_;

  base::ObserverList<Observer> observers_;
};

}  // namespace hud_display
}  // namespace ash

#endif  // ASH_HUD_DISPLAY_ASH_TRACING_MANAGER_H_
