// Copyright 2012 Google Inc. All Rights Reserved.
// Author: alicejwang@google.com (Alice Wang)

#ifndef BRUNO_PLATFORM_PERIPHERAL_PLATFORM_H_
#define BRUNO_PLATFORM_PERIPHERAL_PLATFORM_H_

#include <iostream>
#include <fstream>
#include <string>
#include "bruno/constructormagic.h"
#include "bruno/scoped_ptr.h"

#define PLATFORM_FILE   "/etc/platform"
#define COMMENT_CHAR '#'

namespace bruno_platform_peripheral {

enum BrunoPlatformTypes {
  BRUNO_PLATFORM_FIRST = 0,
  BRUNO_GFMS100 = 0,      /* Bruno-IS */
  BRUNO_GFHD100,          /* Bruno */
  BRUNO_GFRG200,          /* Sideswipe noHDD */
  BRUNO_GFRG210,          /* Optimus HDD */
  BRUNO_GFRG250,          /* Optimus Prime HDD */
  BRUNO_GFSC100,          /* Spacecast */
  BRUNO_GFHD200,          /* Camaro */
  BRUNO_GFLT110,          /* Fiber Jack */
  BRUNO_GFHD254,          /* Lockdown */
  BRUNO_GFLT300,          /* Go-Long FiberJack */
  BRUNO_GFCH100,          /* Chimera mm-wave */
  BRUNO_UNKNOWN
};

class Platform {

 public:
  explicit Platform()
      : name_("Unknown"), type_(BRUNO_UNKNOWN), has_hdd_(false),
        has_aux1_(false), has_fan_(false) {}

  Platform(const std::string& name, BrunoPlatformTypes type, bool has_hdd,
           bool has_aux1, bool has_fan)
      : name_(name), type_(type), has_hdd_(has_hdd), has_aux1_(has_aux1),
        has_fan_(has_fan) {}

  virtual ~Platform() {}

  static const Platform kPlatformTable[];

  void Init(void);
  std::string PlatformName(void) const { return name_; }
  enum BrunoPlatformTypes PlatformType(void) const { return type_; }
  bool has_hdd(void) const { return has_hdd_; }
  bool has_fan(void) const { return has_fan_; }
  bool has_aux1(void) const { return has_aux1_; }
  std::string GetLine(char *file, std::string *pattern);

 private:
  std::string name_;
  BrunoPlatformTypes type_;
  bool has_hdd_;
  bool has_aux1_;
  bool has_fan_;

  void GetPlatformType(void);
  DISALLOW_COPY_AND_ASSIGN(Platform);
};

}  // namespace bruno_platform_peripheral

#endif  // BRUNO_PLATFORM_PERIPHERAL_PLATFORM_H_
