#include "host.h"
#include "common.h"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#if defined(__linux__)
#include <unistd.h>
#endif

const char *display_host() {
#if !defined(__HAIKU__)
  char *out = (char *)from_cache("/tmp/farfetch/host");
  if (out) return out;
#else
  char *out = NULL;
#endif
  const char *cmd = NULL;

#if defined(__OpenBSD__)
  cmd = "sysctl -n hw.vendor && echo \" \" && "
        "if [ \"$(sysctl -n hw.version 2>&1)\" != "
        "\"sysctl: hw.version: value is not available\" ]; then "
        "sysctl -n hw.version && echo \" \"; fi && "
        "sysctl -n hw.product";
#elif defined(__FreeBSD__)
  cmd = "kenv | grep smbios.system.family | sed 's/\"//g' | "
          "sed 's/smbios.system.family=//' && "
        "kenv | grep smbios.system.version | sed 's/\"//g' | "
          "sed 's/smbios.system.version=//' && "
        "kenv | grep smbios.system.product | sed 's/\"//g' | "
          "sed 's/smbios.system.product=//' && "
        "kenv | grep smbios.system.maker | sed 's/\"//g' | "
        "sed 's/smbios.system.maker=//'";
#elif defined(__NetBSD__)
  cmd = "sysctl -n machdep.dmi.system-vendor && "
        "echo \" \" && sysctl -n machdep.dmi.system-version && "
        "echo \" \" && sysctl -n machdep.dmi.system-product";
#elif defined(__sun)
  cmd = "smbios | grep \"Product\" | "
        "sed 's/ Product: //' | awk '{$1=$1};1' | head -1";
#elif defined(__linux__)
  const char *pre_cmd = NULL;

  if (access("/system/app/", F_OK) != -1) {
    pre_cmd = "getprop ro.product.brand && echo \" \" && getprop ro.product.model";
  } else if (
      access("/sys/devices/virtual/dmi/id/product_name", F_OK) != -1 &&
      access("/sys/devices/virtual/dmi/id/product_version", F_OK) != 1
  ) {
    pre_cmd = "cat /sys/devices/virtual/dmi/id/product_name && echo \" \" && "
          "cat /sys/devices/virtual/dmi/id/product_version";
  } else if (access("/sys/firmware/devicetree/base/model", F_OK) != -1) {
    pre_cmd = "cat /sys/firmware/devicetree/base/model";
  } else if (access("/tmp/sysinfo/model", F_OK) != 1) {
    pre_cmd = "cat /tmp/sysinfo/model";
  } else {
    return "Unknown";
  }

  size_t cmdlen = 1024;
  cmd = malloc(cmdlen);
  if (!cmd) return "Unknown";

  snprintf((char *)cmd, cmdlen, "%s | sed '/To be filled by O.E.M./d; "
      "/To Be Filled By O.E.M./d; /OEM/d; /Not Applicable/d; "
      "/System Product Name/d; /System Version/d; /Undefined/d; /Default string/d; "
      "/Not Specified/d; /Type1ProductConfigId/d; /INVALID/d; "
      "/All Series/d' ", pre_cmd);
#elif defined(__APPLE__)
  cmd = "sysctl -n hw.model";
#endif

  if (!cmd) return "Unknown";

  out = (char *)run_command_s(cmd);
#if defined(__linux__)
  free((void *)cmd);
#endif
#if !defined(__HAIKU__)
  to_cache("/tmp/farfetch/host", out);
#endif

  return out;
}