// Copyright 2018 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 OOBE_CONFIG_OOBE_CONFIG_H_
#define OOBE_CONFIG_OOBE_CONFIG_H_

#include <memory>
#include <string>

#include <base/files/file_path.h>

namespace oobe_config {

class RollbackData;

// Helper class for saving and restoring rollback data. Testing is possible with
// |set_prefix_path_for_testing|.
class OobeConfig {
 public:
  OobeConfig();
  OobeConfig(const OobeConfig&) = delete;
  OobeConfig& operator=(const OobeConfig&) = delete;

  ~OobeConfig();

  // Saves the rollback data into an encrypted file.
  bool EncryptedRollbackSave() const;

  // Restores the rollback data from an encrypted file.
  bool EncryptedRollbackRestore() const;

  // Removes all files from kEncryptedStatefulRollbackDataPath.
  void CleanupEncryptedStatefulDirectory() const;

  // Sets a prefix path which is used as file system root when testing. Setting
  // to an empty path removes the prefix.
  void set_prefix_path_for_testing(const base::FilePath& prefix_path) {
    prefix_path_for_testing_ = prefix_path;
  }

  // Sets a network config which is used instead of requesting network
  // configuration via mojo from Chrome.
  void set_network_config_for_testing(const std::string& config) {
    network_config_for_testing_ = config;
  }

  // Reads the content of the file at |file_path| (inside the testing prefix if
  // set) and returns it in |out_content|.
  // Returns true if reading the file succeeded.
  // Returns false if the file doesn't exist or reading it fails, |out_content|
  // is set to empty string in this case.
  bool ReadFile(const base::FilePath& file_path,
                std::string* out_content) const;

  // Returns whether the file at |file_path| (inside the testing prefix if set)
  // exists.
  bool FileExists(const base::FilePath& file_path) const;

  // Writes |data| into a file at |file_path| (inside the testing prefix if
  // set).
  // Returns true if writing the file succeeded, false otherwise.
  bool WriteFile(const base::FilePath& file_path,
                 const std::string& data) const;

  bool ShouldRestoreRollbackData() const;

  bool ShouldSaveRollbackData() const;
  bool DeleteRollbackSaveFlagFile() const;

 private:
  // Returns the file path of |file_path| which includes the prefix if set.
  // |file_path| must be an absolute path starting with "/".
  base::FilePath GetPrefixedFilePath(const base::FilePath& file_path) const;

  // Reads the content of the file at |file_path| and returns it in
  // |out_content|. Doesn't respect the testing prefix. Returns true if reading
  // the file succeeded. Returns false if the file doesn't exist or reading it
  // fails, |out_content| is set to empty string in this case.
  bool ReadFileWithoutPrefix(const base::FilePath& file_path,
                             std::string* out_content) const;
  // Writes |data| into a file at |file_path|. Doesn't respect the testing
  // prefix. Returns true if the write succeeded, false otherwise.
  bool WriteFileWithoutPrefix(const base::FilePath& file_path,
                              const std::string& data) const;

  // Gets the files needed for rollback and stores them in a |RollbackData|
  // proto, then returns the serialized proto |serialized_rollback_data|.
  bool GetSerializedRollbackData(std::string* serialized_rollback_data) const;

  // Gets the files needed for rollback and returns them in |rollback_data|.
  void GetRollbackData(RollbackData* rollback_data) const;

  // We're prefixing all paths for testing with a temp directory. Empty (no
  // prefix) by default.
  base::FilePath prefix_path_for_testing_;

  // Network configuration to be used in unit tests instead of requesting
  // network configuration from Chrome.
  std::string network_config_for_testing_;
};

}  // namespace oobe_config

#endif  // OOBE_CONFIG_OOBE_CONFIG_H_
