// 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 "buffet/buffet_config.h"

#include <base/logging.h>
#include <base/strings/string_number_conversions.h>

namespace buffet {
namespace config_keys {

const char kClientId[]             = "client_id";
const char kClientSecret[]         = "client_secret";
const char kApiKey[]               = "api_key";
const char kOAuthURL[]             = "oauth_url";
const char kServiceURL[]           = "service_url";
const char kDeviceKind[]           = "device_kind";
const char kName[]                 = "name";
const char kDefaultDisplayName[]   = "default_display_name";
const char kDefaultDescription[]   = "default_description";
const char kDefaultLocation[]      = "default_location";
const char kModelId[]              = "model_id";
const char kPollingPeriodMs[]      = "polling_period_ms";

}  // namespace config_keys

void BuffetConfig::Load(const base::FilePath& config_path) {
  chromeos::KeyValueStore store;
  if (store.Load(config_path)) {
    Load(store);
  }
}

void BuffetConfig::Load(const chromeos::KeyValueStore& store) {
  store.GetString(config_keys::kClientId, &client_id_);
  store.GetString(config_keys::kClientSecret, &client_secret_);
  store.GetString(config_keys::kApiKey, &api_key_);
  store.GetString(config_keys::kOAuthURL, &oauth_url_);
  store.GetString(config_keys::kServiceURL, &service_url_);
  store.GetString(config_keys::kDeviceKind, &device_kind_);
  store.GetString(config_keys::kName, &name_);
  store.GetString(config_keys::kDefaultDisplayName, &default_display_name_);
  store.GetString(config_keys::kDefaultDescription, &default_description_);
  store.GetString(config_keys::kDefaultLocation, &default_location_);
  store.GetString(config_keys::kModelId, &model_id_);
  std::string polling_period_str;
  if (store.GetString(config_keys::kPollingPeriodMs, &polling_period_str)) {
    CHECK(base::StringToUint64(polling_period_str, &polling_period_ms_))
        << "Failed to parse polling period in configuration file.";
    VLOG(1) << "Using a polling period of " << polling_period_ms_
            << " milliseconds.";
  }
}

}  // namespace buffet
