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

#ifndef MEMS_SETUP_DELEGATE_H_
#define MEMS_SETUP_DELEGATE_H_

#include <unistd.h>

#include <optional>
#include <string>
#include <vector>

#include <base/files/file_path.h>
#include <chromeos-config/libcros_config/cros_config_interface.h>

namespace mems_setup {

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

  virtual std::optional<std::string> ReadVpdValue(const std::string& key) = 0;
  virtual bool ProbeKernelModule(const std::string& module) = 0;

  virtual bool CreateDirectory(const base::FilePath&) = 0;
  virtual bool Exists(const base::FilePath&) = 0;
  virtual std::vector<base::FilePath> EnumerateAllFiles(
      base::FilePath file_path) = 0;
  virtual std::optional<std::string> ReadFileToString(
      const base::FilePath&) = 0;

  virtual std::optional<gid_t> FindGroupId(const char* group) = 0;

  virtual int GetPermissions(const base::FilePath& path) = 0;
  virtual bool SetPermissions(const base::FilePath& path, int mode) = 0;

  virtual bool SetOwnership(const base::FilePath& path,
                            uid_t user,
                            gid_t group) = 0;

  virtual std::optional<std::string> GetIioSarSensorDevlink(
      std::string sys_path) = 0;

  virtual brillo::CrosConfigInterface* GetCrosConfig() = 0;

 protected:
  Delegate() = default;
  Delegate(const Delegate&) = delete;
  Delegate& operator=(const Delegate&) = delete;
};

}  // namespace mems_setup

#endif  // MEMS_SETUP_DELEGATE_H_
