// Copyright 2015 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.

#include "examples/ubuntu/file_config_store.h"

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

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

namespace weave {
namespace examples {

const char kSettingsDir[] = "/var/lib/weave/";
const char kSettingsPath[] = "/var/lib/weave/weave_settings.json";
const char kCategory[] = "example";

FileConfigStore::FileConfigStore(bool disable_security)
    : disable_security_{disable_security} {}

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 = "AAAAA";
  settings->pairing_modes = {PairingType::kEmbeddedCode};
  settings->embedded_code = "0000";
  settings->client_id = "58855907228.apps.googleusercontent.com";
  settings->client_secret = "eHSAREAHrIqPsHBxCE9zPPBi";
  settings->api_key = "AIzaSyDSq46gG-AxUnC3zoqD9COIPrjolFsMfMA";

  settings->disable_security = disable_security_;
  return true;
}

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

void FileConfigStore::SaveSettings(const std::string& settings) {
  CHECK(mkdir(kSettingsDir, S_IRWXU) == 0 || errno == EEXIST);
  LOG(INFO) << "Saving settings to " << kSettingsPath;
  std::ofstream str(kSettingsPath);
  str << settings;
}

std::vector<std::string> FileConfigStore::LoadCommandDefs() {
  return {R"({
    "base": {
      "updateBaseConfiguration": {},
      "identify": {},
      "updateDeviceInfo": {}
    },
    "_greeter": {
      "_greet": {
        "minimalRole": "user",
        "parameters": { "_name": "string"},
        "results": { "_greeting": "string" }
      }
    },
    "_ledflasher": {
       "_set":{
         "parameters": {
           "_led": {"minimum": 1, "maximum": 3},
           "_on": "boolean"
         }
       },
       "_toggle":{
         "parameters": {
           "_led": {"minimum": 1, "maximum": 3}
         }
      }
    }
  })"};
}
std::vector<std::string> FileConfigStore::LoadStateDefs() {
  return {R"({
    "_greeter": {"_greetings_counter":"integer"},
    "_ledflasher": {"_leds": {"items": "boolean"}}
  })"};
}

std::vector<std::string> FileConfigStore::LoadStateDefaults() {
  return {R"({
    "_greeter": {"_greetings_counter": 0},
    "_ledflasher":{"_leds": [false, false, false]}
  })"};
}

}  // namespace examples
}  // namespace weave
