#pragma once
#include <map>
#include <string>
#include <list>

// #define class struct // Uncomment this line to switch all the classes to structs

// using namespace std; 

class Hardware {

  public:
    std::string manufacturer;
    std::string model;
    int releasedyear;

  // example of how to set a dictionary item
  // std::string myval = HardwareSpecs.at("manufacturer");

};

class Mobo: public Hardware {
  public:
  int pciegen;
  int piceslots;
  int dimmslots;
  int dualchannel;  // This is an int so 1 = dualchannel and 2 = quad channel
  int ramspeed;
  std::string comment; 

  std::map<std::string, std::string> HardwareSpecs = {
    {"manufacturer", "The Gnomes part 2"},
    {"model", "Honey Bomb"},
    {"ReleasedYear", "2025"},
    {"pciegen", "4"},
    {"pcieslots", "3"},
    {"dimmslots", "2"},
    {"ramchannels", "2"},
    {"ramspeed", "6000"},
    {"comment", "If on AM5 platform - update BIOS before booting!"},
  };
};

class CPU: public Hardware {
  public:
    std::map<std::string, std::string> HardwareSpecs = {
      {"manufacturer", "The Gnomes part 2"},
      {"model", "Honey Bomb"},
      {"ReleasedYear", "2025"},
      {"bits", "64"},
      {"igpu", "false"},
      {"igpusize", "N/A"},
      {"cores", "4"},
      {"threads", "8"},
      {"l1cache", "32Mb"},
      {"l2cache", "32Mb"},
      {"l3cache", "32Mb"},
      {"pcielanes", "24"},
      {"maxram", "256Gb"},
      {"mainclock", "3Ghz"},
      {"boostclock", "3.2Ghz"},
      {"architecture", "x86_64"},
      {"memoryrange", "00:00 - set me!"},
      {"microcode", "unchanged"},
      {"kerneldriver", "intel"},
      {"comment", "If on AM5 platform - update BIOS before booting!"},
    };
};

class GPU: public Hardware {
  public:
  std::map<std::string, GPU> GPUSpecs;
     // GPUSpecs["Ram"] = GPU { "Ram", "12Gb" };
};
