// Copyright 2015 The Weave Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "examples/provider/file_config_store.h"

#include <sys/stat.h>
#include <sys/utsname.h>

#include <fstream>
#include <map>
#include <string>
#include <vector>

#include <base/bind.h>

namespace weave {
namespace examples {

const char kSettingsDir[] = "/var/lib/weave/";

FileConfigStore::FileConfigStore(const std::string& model_id,
                                 provider::TaskRunner* task_runner)
    : model_id_{model_id},
      task_runner_{task_runner} {}

std::string FileConfigStore::GetPath(const std::string& name) const {
  std::string path{kSettingsDir};
  path += path + "weave_settings_" + model_id_;
  if (!name.empty())
    path += "_" + name;
  return path + ".json";
}

bool FileConfigStore::LoadDefaults(Settings* settings) {
  char host_name[HOST_NAME_MAX] = {};
  gethostname(host_name, HOST_NAME_MAX);

  settings->name = host_name;
  settings->description = "";

  utsname uname_data;
  uname(&uname_data);

  settings->firmware_version = uname_data.sysname;
  settings->oem_name = "Unknown";
  settings->model_name = "Unknown";
  settings->model_id = model_id_;
  settings->pairing_modes = {PairingType::kEmbeddedCode};
  settings->embedded_code = "0000";

  // Keys owners:
  //   avakulenko@google.com
  //   gene@chromium.org
  //   vitalybuka@chromium.org
  settings->client_id =
      "338428340000-vkb4p6h40c7kja1k3l70kke8t615cjit.apps.googleusercontent."
      "com";
  settings->client_secret = "LS_iPYo_WIOE0m2VnLdduhnx";
  settings->api_key = "AIzaSyACK3oZtmIylUKXiTMqkZqfuRiCgQmQSAQ";

  return true;
}

std::string FileConfigStore::LoadSettings() {
  return LoadSettings("");
}

std::string FileConfigStore::LoadSettings(const std::string& name) {
  LOG(INFO) << "Loading settings from " << GetPath(name);
  std::ifstream str(GetPath(name));
  return std::string(std::istreambuf_iterator<char>(str),
                     std::istreambuf_iterator<char>());
}

void FileConfigStore::SaveSettings(const std::string& name,
                                   const std::string& settings,
                                   const DoneCallback& callback) {
  CHECK(mkdir(kSettingsDir, S_IRWXU) == 0 || errno == EEXIST);
  LOG(INFO) << "Saving settings to " << GetPath(name);
  std::ofstream str(GetPath(name));
  str << settings;
  if (!callback.is_null())
    task_runner_->PostDelayedTask(FROM_HERE, base::Bind(callback, nullptr), {});
}

}  // namespace examples
}  // namespace weave
