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

#ifndef AUTHPOLICY_POLICY_DEVICE_POLICY_ENCODER_H_
#define AUTHPOLICY_POLICY_DEVICE_POLICY_ENCODER_H_

#include <functional>
#include <string>
#include <utility>
#include <vector>

#include <components/policy/core/common/policy_types.h>

#include "authpolicy/policy/policy_encoder_helper.h"

namespace enterprise_management {
class ChromeDeviceSettingsProto;
}  // namespace enterprise_management

namespace policy {

// Connection types for the key::kDeviceUpdateAllowedConnectionTypes policy,
// exposed for tests. The int is actually enterprise_management::
// AutoUpdateSettingsProto_ConnectionType, but we don't want to include
// chrome_device_policy.pb.h here in this header.
extern const std::pair<const char*, int> kConnectionTypes[];
extern const size_t kConnectionTypesSize;

class RegistryDict;

// Private helper class used to convert a RegistryDict into a device policy
// protobuf. Don't include directly, use |preg_policy_encoder.h| instead,
class DevicePolicyEncoder {
 public:
  DevicePolicyEncoder(const RegistryDict* dict, const PolicyLevel level);

  // Toggles logging of policy values.
  void LogPolicyValues(bool enabled) { log_policy_values_ = enabled; }

  // Extracts all supported device policies from |dict| and puts them into
  // |policy|.
  void EncodePolicy(
      enterprise_management::ChromeDeviceSettingsProto* policy) const;

 private:
  // Some logical grouping of policy encoding.
  void EncodeLoginPolicies(
      enterprise_management::ChromeDeviceSettingsProto* policy) const;
  void EncodeNetworkPolicies(
      enterprise_management::ChromeDeviceSettingsProto* policy) const;
  void EncodeAutoUpdatePolicies(
      enterprise_management::ChromeDeviceSettingsProto* policy) const;
  void EncodeAccessibilityPolicies(
      enterprise_management::ChromeDeviceSettingsProto* policy) const;
  void EncodeGenericPolicies(
      enterprise_management::ChromeDeviceSettingsProto* policy) const;
  void EncodePoliciesWithPolicyOptions(
      enterprise_management::ChromeDeviceSettingsProto* policy) const;

  // Boolean policies.
  base::Optional<bool> EncodeBoolean(const char* policy_name) const;

  // Integer policies.
  base::Optional<int> EncodeInteger(const char* policy_name) const;
  // Integer in range policies.
  base::Optional<int> EncodeIntegerInRange(const char* policy_name,
                                           int range_min,
                                           int range_max) const;
  // String policies.
  base::Optional<std::string> EncodeString(const char* policy_name) const;

  // String list policies are a little different. Unlike the basic types they
  // are not stored as registry value, but as registry key with values 1, 2, ...
  // for the entries.
  base::Optional<std::vector<std::string>> EncodeStringList(
      const char* policy_name) const;

  // Prints out an error message if the |policy_name| is contained in the
  // registry dictionary. Use this for unsupported policies.
  void HandleUnsupported(const char* policy_name) const;

 private:
  const RegistryDict* dict_ = nullptr;
  const PolicyLevel level_;
  bool log_policy_values_ = false;
};

}  // namespace policy

#endif  // AUTHPOLICY_POLICY_DEVICE_POLICY_ENCODER_H_
