// Copyright 2020 The Chromium OS 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 DLCSERVICE_SYSTEM_STATE_H_
#define DLCSERVICE_SYSTEM_STATE_H_

#include <memory>

#include <base/files/file_path.h>
#include <base/time/time.h>
#include <base/time/clock.h>
#include <dlcservice/proto_bindings/dlcservice.pb.h>
#include <imageloader/dbus-proxies.h>
#include <session_manager/dbus-proxies.h>
#include <update_engine/proto_bindings/update_engine.pb.h>
#include <update_engine/dbus-proxies.h>

#include "dlcservice/boot/boot_slot.h"
#include "dlcservice/dlc_manager.h"
#include "dlcservice/metrics.h"
#include "dlcservice/state_change_reporter_interface.h"
#include "dlcservice/system_properties.h"

namespace dlcservice {

class SystemState {
 public:
  virtual ~SystemState() = default;

  // Creates a singleton |SystemState| that can be accessible globally by
  // calling |SystemState::Get()|. Subsequent calls will fail and is an error.
  // But if |for_test| is true, repeated calls can be made during testing to
  // reset |SystemState|. Note: Should only be used during tests.
  static void Initialize(
      std::unique_ptr<org::chromium::ImageLoaderInterfaceProxyInterface>
          image_loader_proxy,
      std::unique_ptr<org::chromium::UpdateEngineInterfaceProxyInterface>
          update_engine_proxy,
      std::unique_ptr<org::chromium::SessionManagerInterfaceProxyInterface>
          session_manage_proxy,
      StateChangeReporterInterface* state_change_reporter,
      std::unique_ptr<BootSlot> boot_slot,
      std::unique_ptr<Metrics> metrics,
      std::unique_ptr<SystemProperties> system_properties,
      const base::FilePath& manifest_dir,
      const base::FilePath& preloaded_content_dir,
      const base::FilePath& content_dir,
      const base::FilePath& prefs_dir,
      const base::FilePath& users_dir,
      const base::FilePath& verification_file,
      base::Clock* clock,
      bool for_test = false);

  // Gets the pointer to the current |SystemState|.
  static SystemState* Get();

  // Getters for states that |SystemState| holds.
  org::chromium::ImageLoaderInterfaceProxyInterface* image_loader() const;
  org::chromium::UpdateEngineInterfaceProxyInterface* update_engine() const;
  org::chromium::SessionManagerInterfaceProxyInterface* session_manager() const;
  Metrics* metrics() const;
  StateChangeReporterInterface* state_change_reporter() const;
  SystemProperties* system_properties() const;
  const base::FilePath& manifest_dir() const;
  const base::FilePath& preloaded_content_dir() const;
  const base::FilePath& content_dir() const;
  const base::FilePath& prefs_dir() const;
  base::FilePath dlc_prefs_dir() const;
  const base::FilePath& users_dir() const;
  const base::FilePath& verification_file() const;

  // Getting active and inactive boot slots easily.
  BootSlot::Slot active_boot_slot() const;
  BootSlot::Slot inactive_boot_slot() const;

  // Return true if the device is removable.
  bool IsDeviceRemovable() const;

  // Returns the clock object.
  base::Clock* clock() const;

  void set_update_engine_status(const update_engine::StatusResult& status);
  const update_engine::StatusResult& update_engine_status();
  const base::Time& update_engine_status_timestamp();

 protected:
  SystemState(
      std::unique_ptr<org::chromium::ImageLoaderInterfaceProxyInterface>
          image_loader_proxy,
      std::unique_ptr<org::chromium::UpdateEngineInterfaceProxyInterface>
          update_engine_proxy,
      std::unique_ptr<org::chromium::SessionManagerInterfaceProxyInterface>
          session_manager_proxy,
      StateChangeReporterInterface* state_change_reporter,
      std::unique_ptr<BootSlot> boot_slot,
      std::unique_ptr<Metrics> metrics,
      std::unique_ptr<SystemProperties> system_properties,
      const base::FilePath& manifest_dir,
      const base::FilePath& preloaded_content_dir,
      const base::FilePath& content_dir,
      const base::FilePath& prefs_dir,
      const base::FilePath& users_dir,
      const base::FilePath& verification_file,
      base::Clock* clock);

 private:
  std::unique_ptr<org::chromium::ImageLoaderInterfaceProxyInterface>
      image_loader_proxy_;
  std::unique_ptr<org::chromium::UpdateEngineInterfaceProxyInterface>
      update_engine_proxy_;
  std::unique_ptr<org::chromium::SessionManagerInterfaceProxyInterface>
      session_manager_proxy_;
  StateChangeReporterInterface* state_change_reporter_;

  std::unique_ptr<Metrics> metrics_;
  std::unique_ptr<SystemProperties> system_properties_;
  base::FilePath manifest_dir_;
  base::FilePath preloaded_content_dir_;
  base::FilePath content_dir_;
  base::FilePath prefs_dir_;
  BootSlot::Slot active_boot_slot_;
  base::FilePath users_dir_;
  base::FilePath verification_file_;
  base::Clock* clock_;
  bool is_device_removable_;

  // Keep the last status result we saw.
  update_engine::StatusResult last_update_engine_status_;
  base::Time last_update_engine_status_timestamp_;

  static std::unique_ptr<SystemState> g_instance_;

  SystemState(const SystemState&) = delete;
  SystemState& operator=(const SystemState&) = delete;
};

}  // namespace dlcservice

#endif  // DLCSERVICE_SYSTEM_STATE_H_
