// Copyright 2015 The Android Open Source Project
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef BUFFET_BUFFET_CONFIG_H_
#define BUFFET_BUFFET_CONFIG_H_

#include <map>
#include <set>
#include <string>
#include <vector>

#include <base/callback.h>
#include <base/files/file_path.h>
#include <brillo/errors/error.h>
#include <brillo/key_value_store.h>
#include <weave/provider/config_store.h>

#include "buffet/encryptor.h"

namespace buffet {

class StorageInterface;

// Handles reading buffet config and state files.
class BuffetConfig final : public weave::provider::ConfigStore {
 public:
  struct Options {
    base::FilePath defaults;
    base::FilePath settings;

    base::FilePath definitions;
    base::FilePath test_definitions;

    std::string test_privet_ssid;
  };

  // An IO abstraction to enable testing without using real files.
  class FileIO {
   public:
    virtual ~FileIO() = default;
    virtual bool ReadFile(const base::FilePath& path, std::string* content) = 0;
    virtual bool WriteFile(const base::FilePath& path,
                           const std::string& content) = 0;
  };

  ~BuffetConfig() override = default;

  explicit BuffetConfig(const Options& options);

  // Config overrides.
  bool LoadDefaults(weave::Settings* settings) override;
  std::string LoadSettings(const std::string& name) override;
  std::string LoadSettings() override;
  void SaveSettings(const std::string& name,
                    const std::string& settings,
                    const weave::DoneCallback& callback) override;

  bool LoadDefaults(const brillo::KeyValueStore& store,
                    weave::Settings* settings);

  // Allows injection of a non-default |encryptor| for testing. The caller
  // retains ownership of the pointer.
  void SetEncryptor(Encryptor* encryptor) {
    encryptor_ = encryptor;
  }

  // Allows injection of non-default |file_io| for testing. The caller retains
  // ownership of the pointer.
  void SetFileIO(FileIO* file_io) {
    file_io_ = file_io;
  }

 private:
  base::FilePath CreatePath(const std::string& name) const;
  bool LoadFile(const base::FilePath& file_path,
                std::string* data,
                brillo::ErrorPtr* error);

  Options options_;
  std::unique_ptr<Encryptor> default_encryptor_;
  Encryptor* encryptor_{nullptr};
  std::unique_ptr<FileIO> default_file_io_;
  FileIO* file_io_{nullptr};

  DISALLOW_COPY_AND_ASSIGN(BuffetConfig);
};

}  // namespace buffet

#endif  // BUFFET_BUFFET_CONFIG_H_
