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

#include "bruno/logging.h"
#include "bruno/sigslot.h"
#include "platform.h"

namespace bruno_platform_peripheral {

/* Platform table */
const Platform Platform::kPlatformTable[] = {
         /* model     type           hdd    aux1   fan */
  Platform("GFMS100", BRUNO_GFMS100, true,  false, true),
  Platform("GFHD100", BRUNO_GFHD100, false, false, true),
  Platform("GFHD200", BRUNO_GFHD200, false, false, false),
  Platform("GFRG200", BRUNO_GFRG200, false, false, true),
  Platform("GFRG210", BRUNO_GFRG210, true,  false, true),
  Platform("GFRG250", BRUNO_GFRG250, true,  true,  true),
  Platform("GFSC100", BRUNO_GFSC100, true,  false, true),
  Platform("GFLT110", BRUNO_GFLT110, false, false, false),
  Platform("GFLT120", BRUNO_GFLT110, false, false, false),
  Platform("GFHD254", BRUNO_GFHD254, false, true, true),
  Platform("GFLT300", BRUNO_GFLT300, false, false, false),
  Platform("GFCH100", BRUNO_GFCH100, false, false, false),
  Platform("UNKNOWN PLATFORM", BRUNO_UNKNOWN, false, false,  false),
};

void Platform::Init(void) {
  GetPlatformType();
}

#define ARRAYSIZE(a) \
  (static_cast<size_t>((sizeof(a) / sizeof(*(a)))) /  \
   static_cast<size_t>(!(sizeof(a) % sizeof(*(a)))))

void Platform::GetPlatformType(void) {
  std::string result = GetLine((char *)PLATFORM_FILE, NULL);

  for (int i = 0; i < (int)ARRAYSIZE(Platform::kPlatformTable); i++) {
    if (result == kPlatformTable[i].name_) {
      name_ = kPlatformTable[i].name_;
      type_ = kPlatformTable[i].type_;
      has_hdd_ = kPlatformTable[i].has_hdd_;
      has_aux1_ = kPlatformTable[i].has_aux1_;
      has_fan_ = kPlatformTable[i].has_fan_;
      break;
    }
  }

  if (type_ == BRUNO_UNKNOWN) {
    LOG(LS_ERROR) << "Unsupported Platform - " << result << std::endl;
  }
  fprintf(stderr, "plat_type=%s\n", name_.c_str());
  return;
}

/* Search the pattern in the file.
 * 1) If the pattern found in the string, return the string.
 * 2) Otherwse, a NULL string.
 */
std::string Platform::GetLine(char *file, std::string *pattern) {
  std::string result;
  std::ifstream opened_file;

  result.clear();
  opened_file.open (file);
  if(opened_file.is_open()) {
    while(!opened_file.eof()) {
      getline(opened_file, result);
      if (pattern == NULL) {
        /* If no pattern specified, return the first read line */
        break;
      }
      /* skip this line if leading chararcter is '#' */
      else if (result[0] != COMMENT_CHAR &&
          result.compare(0, pattern->size(), *pattern) == 0) {
        break;      /* Found the pattern. Exit */
      }
    }
    opened_file.close();
  }
  else {
    LOG(LS_INFO) << "Unable to open this file." << std::endl;
  }

  return result;
}

}  // namespace bruno_platform_peripheral
