#include <stdio.h>
#include <string.h>
#include "switches.h"

static const char *BRAND_NAMES[] = {
  "Kailh",
  "Kailh Low Profile Choc",
  "Gateron",
  "Cherry MX",
  "Cherry ML",
  "Outemu",
  "Greetech",
  "Varmilo",
  "MOD",
  "Hako"
};

static const char *COLOR_NAMES[] = {
  "",
  "White",
  "Black",
  "Blue",
  "Red",
  "Yellow",
  "Brown",
  "Green",
  "Clear",
  "Silver",
  "Nature White",
  "Grey",
  "Jade",
  "Navy",
  "Burnt Orange",
  "Pale Blue",
  "Dark Yellow",
  "Gold",
  "Chocolate White",
  "Burgundy",
  "Purple",
  "Light Green",
  "True",
  "Berry",
  "Plum",
  "Sage",
  "Violet",
  "L",
  "M",
  "H",
  "SH"
};

static const char *VARIANT_NAMES[] = {
  "",
  "BOX",
  "BOX Thick",
  "BOX Heavy",
  "Silent",
  "Tactile",
  "Linear",
  "Speed",
  "Speed Heavy",
  "Speed Thick Click",
  "Pro",
  "Pro Heavy",
  "Royal",
  "Thick Click",
  "Heavy"
};

const char *brand_name(struct mechswitch ms) {
  return BRAND_NAMES[ms.brand - 1];
}

const char *variant_name(struct mechswitch ms) {
  return VARIANT_NAMES[ms.variant];
}

const char *color_name(struct mechswitch ms) {
  return COLOR_NAMES[ms.color];
}

void switch_name(struct mechswitch ms, char *buf) {
  const char *v_name = variant_name(ms);
  const char *c_name = color_name(ms);

  snprintf(buf, MAX_SWITCH_NAME_LENGTH, "%s", brand_name(ms));
  strncat(buf, " ", MAX_SWITCH_NAME_LENGTH - strlen(buf));
  if (strlen(v_name) > 0) {
    strncat(buf, v_name, MAX_SWITCH_NAME_LENGTH - strlen(buf));
    strncat(buf, " ", MAX_SWITCH_NAME_LENGTH - strlen(buf));
  }
  if (strlen(c_name) > 0) {
    strncat(buf, c_name, MAX_SWITCH_NAME_LENGTH - strlen(buf));
  }
}

int bitfieldtoi(struct mechswitch ms) {
  return ((ms.brand << 9) | (ms.variant << 5) | ms.color);
}