// Copyright 2014 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 APMANAGER_CONFIG_H_
#define APMANAGER_CONFIG_H_

#include <memory>
#include <string>

#include <base/macros.h>
#include <base/memory/ref_counted.h>
#include <brillo/errors/error.h>

#include "apmanager/config_adaptor_interface.h"

namespace apmanager {

class Error;
class Device;
class Manager;

class Config {
 public:
  Config(Manager* manager, int service_identifier);
  virtual ~Config();

  bool ValidateSsid(Error* error, const std::string& value);
  bool ValidateSecurityMode(Error* error, const std::string& value);
  bool ValidatePassphrase(Error* error, const std::string& value);
  bool ValidateHwMode(Error* error, const std::string& value);
  bool ValidateOperationMode(Error* error, const std::string& value);
  bool ValidateChannel(Error* error, const uint16_t& value);

  // Calculate the frequency based on the given |channel|. Return true and set
  // the output |frequency| if is valid channel, false otherwise.
  static bool GetFrequencyFromChannel(uint16_t channel, uint32_t* freq);

  // Generate a config file string for a hostapd instance. Populate
  // |error| when encounter invalid configuration. Return true if success,
  // false otherwise.
  virtual bool GenerateConfigFile(Error* error, std::string* config_str);

  // Claim and release the device needed for this configuration.
  virtual bool ClaimDevice();
  virtual bool ReleaseDevice();

  // Getter and setter for configuration properties.
  void SetSsid(const std::string& ssid);
  std::string GetSsid() const;
  void SetInterfaceName(const std::string& interface_name);
  std::string GetInterfaceName() const;
  void SetSecurityMode(const std::string& security_mode);
  std::string GetSecurityMode() const;
  void SetPassphrase(const std::string& passphrase);
  std::string GetPassphrase() const;
  void SetHwMode(const std::string& hw_mode);
  std::string GetHwMode() const;
  void SetOperationMode(const std::string& op_mode);
  std::string GetOperationMode() const;
  void SetChannel(uint16_t channel);
  uint16_t GetChannel() const;
  void SetHiddenNetwork(bool hidden);
  bool GetHiddenNetwork() const;
  void SetBridgeInterface(const std::string& interface_name);
  std::string GetBridgeInterface() const;
  void SetServerAddressIndex(uint16_t);
  uint16_t GetServerAddressIndex() const;
  void SetFullDeviceControl(bool full_control);
  bool GetFullDeviceControl() const;

  const std::string& control_interface() const { return control_interface_; }
  void set_control_interface(const std::string& control_interface) {
    control_interface_ = control_interface;
  }

  const std::string& selected_interface() const { return selected_interface_; }

  ConfigAdaptorInterface* adaptor() const { return adaptor_.get(); }

 private:
  // Keys used in hostapd config file.
  static const char kHostapdConfigKeyBridgeInterface[];
  static const char kHostapdConfigKeyChannel[];
  static const char kHostapdConfigKeyControlInterface[];
  static const char kHostapdConfigKeyControlInterfaceGroup[];
  static const char kHostapdConfigKeyDriver[];
  static const char kHostapdConfigKeyFragmThreshold[];
  static const char kHostapdConfigKeyHTCapability[];
  static const char kHostapdConfigKeyHwMode[];
  static const char kHostapdConfigKeyIeee80211ac[];
  static const char kHostapdConfigKeyIeee80211n[];
  static const char kHostapdConfigKeyIgnoreBroadcastSsid[];
  static const char kHostapdConfigKeyInterface[];
  static const char kHostapdConfigKeyRsnPairwise[];
  static const char kHostapdConfigKeyRtsThreshold[];
  static const char kHostapdConfigKeySsid[];
  static const char kHostapdConfigKeyWepDefaultKey[];
  static const char kHostapdConfigKeyWepKey0[];
  static const char kHostapdConfigKeyWpa[];
  static const char kHostapdConfigKeyWpaKeyMgmt[];
  static const char kHostapdConfigKeyWpaPassphrase[];

  // Hardware mode value for hostapd config file.
  static const char kHostapdHwMode80211a[];
  static const char kHostapdHwMode80211b[];
  static const char kHostapdHwMode80211g[];

  // Default hostapd configuration values. User will not be able to configure
  // these.
  static const char kHostapdDefaultDriver[];
  static const char kHostapdDefaultRsnPairwise[];
  static const char kHostapdDefaultWpaKeyMgmt[];
  static const int kHostapdDefaultFragmThreshold;
  static const int kHostapdDefaultRtsThreshold;

  // Default config property values.
  static const uint16_t kPropertyDefaultChannel;;
  static const bool kPropertyDefaultHiddenNetwork;
  static const uint16_t kPropertyDefaultServerAddressIndex;

  // Constants use for converting channel to frequency.
  static const uint16_t kBand24GHzChannelLow;
  static const uint16_t kBand24GHzChannelHigh;
  static const uint32_t kBand24GHzBaseFrequency;
  static const uint16_t kBand5GHzChannelLow;
  static const uint16_t kBand5GHzChannelHigh;
  static const uint16_t kBand5GHzBaseFrequency;

  static const int kSsidMinLength;
  static const int kSsidMaxLength;
  static const int kPassphraseMinLength;
  static const int kPassphraseMaxLength;

  // Append default hostapd configurations to the config file.
  bool AppendHostapdDefaults(Error* error, std::string* config_str);

  // Append hardware mode related configurations to the config file.
  bool AppendHwMode(Error* error, std::string* config_str);

  // Determine/append interface configuration to the config file.
  bool AppendInterface(Error* error, std::string* config_str);

  // Append security related configurations to the config file.
  bool AppendSecurityMode(Error* error, std::string* config_str);

  Manager* manager_;
  std::string control_interface_;
  // Interface selected for hostapd.
  std::string selected_interface_;
  scoped_refptr<Device> device_;

  std::unique_ptr<ConfigAdaptorInterface> adaptor_;

  DISALLOW_COPY_AND_ASSIGN(Config);
};

}  // namespace apmanager

#endif  // APMANAGER_CONFIG_H_
