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

#ifndef CHROMEOS_NETWORK_NETWORK_UI_DATA_H_
#define CHROMEOS_NETWORK_NETWORK_UI_DATA_H_

#include <string>

#include "base/basictypes.h"
#include "base/memory/scoped_ptr.h"
#include "chromeos/chromeos_export.h"
#include "chromeos/network/certificate_pattern.h"
#include "chromeos/network/onc/onc_constants.h"

namespace base {
class DictionaryValue;
}

namespace chromeos {

enum ClientCertType {
  CLIENT_CERT_TYPE_NONE    = 0,
  CLIENT_CERT_TYPE_REF     = 1,
  CLIENT_CERT_TYPE_PATTERN = 2
};

// Helper for accessing and setting values in the network's UI data dictionary.
// Accessing values is done via static members that take the network as an
// argument. In order to fill a UI data dictionary, construct an instance, set
// up your data members, and call FillDictionary(). For example, if you have a
// |network|:
//
//      NetworkUIData ui_data;
//      ui_data.set_onc_source(onc::ONC_SOURCE_USER_IMPORT);
//      ui_data.FillDictionary(network->ui_data());
class CHROMEOS_EXPORT NetworkUIData {
 public:
  NetworkUIData();
  NetworkUIData(const NetworkUIData& other);
  NetworkUIData& operator=(const NetworkUIData& other);
  explicit NetworkUIData(const base::DictionaryValue& dict);
  ~NetworkUIData();

  void set_onc_source(onc::ONCSource onc_source) { onc_source_ = onc_source; }
  onc::ONCSource onc_source() const { return onc_source_; }

  void set_certificate_pattern(const CertificatePattern& pattern) {
    certificate_pattern_ = pattern;
  }
  const CertificatePattern& certificate_pattern() const {
    return certificate_pattern_;
  }
  void set_certificate_type(ClientCertType type) {
    certificate_type_ = type;
  }
  ClientCertType certificate_type() const {
    return certificate_type_;
  }
  bool is_managed() const {
    return onc_source_ == onc::ONC_SOURCE_DEVICE_POLICY ||
        onc_source_ == onc::ONC_SOURCE_USER_POLICY;
  }
  const base::DictionaryValue* user_settings() const {
    return user_settings_.get();
  }
  void set_user_settings(scoped_ptr<base::DictionaryValue> dict) {
    user_settings_ = dict.Pass();
  }
  const std::string& policy_guid() const {
    return policy_guid_;
  }
  void set_policy_guid(const std::string& guid) {
    policy_guid_ = guid;
  }

  // Fills in |dict| with the currently configured values. This will write the
  // keys appropriate for Network::ui_data() as defined below (kKeyXXX).
  void FillDictionary(base::DictionaryValue* dict) const;

  // Creates a NetworkUIData object from |onc_network|, which has to be a valid
  // ONC NetworkConfiguration dictionary.
  // This function is used to create the "UIData" field of the Shill
  // configuration.
  static scoped_ptr<NetworkUIData> CreateFromONC(
      onc::ONCSource onc_source,
      const base::DictionaryValue& onc_network);

  // Key for storing source of the ONC network.
  static const char kKeyONCSource[];

  // Key for storing the certificate pattern.
  static const char kKeyCertificatePattern[];

  // Key for storing the certificate type.
  static const char kKeyCertificateType[];

  // Key for storing the user settings.
  static const char kKeyUserSettings[];

 private:
  CertificatePattern certificate_pattern_;
  onc::ONCSource onc_source_;
  ClientCertType certificate_type_;
  scoped_ptr<base::DictionaryValue> user_settings_;
  std::string policy_guid_;
};

}  // namespace chromeos

#endif  // CHROMEOS_NETWORK_NETWORK_UI_DATA_H_
