#include "tlbmc/resource/syslog_config_utils.h"

#include <string>

#include "absl/status/status.h"
#include "absl/status/statusor.h"
#include "absl/strings/str_cat.h"
#include "absl/strings/string_view.h"
#include "resource.pb.h"

namespace milotic_tlbmc {

absl::StatusOr<SyslogProtocol> GetSyslogProtocolFromRedfishString(
    absl::string_view protocol) {
  if (protocol == "TCP") {
    return SYSLOG_PROTOCOL_TCP;
  }
  if (protocol == "UDP") {
    return SYSLOG_PROTOCOL_UDP;
  }
  return absl::InvalidArgumentError(
      absl::StrCat("Unsupported Redfish syslog protocol: ", protocol));
}

absl::StatusOr<absl::string_view> GetRedfishStringFromSyslogProtocol(
    SyslogProtocol protocol) {
  switch (protocol) {
    case SYSLOG_PROTOCOL_TCP:
      return "TCP";
    case SYSLOG_PROTOCOL_UDP:
      return "UDP";
    default:
      return absl::InvalidArgumentError(absl::StrCat(
          "Unknown syslog protocol enum: ", static_cast<int>(protocol)));
  }
}

absl::StatusOr<SyslogTlsMode> GetSyslogTlsModeFromRedfishString(
    absl::string_view tls_mode) {
  if (tls_mode == "TLS") {
    return SYSLOG_TLS_MODE_TLS;
  }
  if (tls_mode == "Disabled") {
    return SYSLOG_TLS_MODE_DISABLED;
  }
  return absl::InvalidArgumentError(
      absl::StrCat("Unsupported Redfish syslog TLS mode: ", tls_mode));
}

absl::StatusOr<absl::string_view> GetRedfishStringFromSyslogTlsMode(
    SyslogTlsMode tls_mode) {
  switch (tls_mode) {
    case SYSLOG_TLS_MODE_TLS:
      return "TLS";
    case SYSLOG_TLS_MODE_DISABLED:
      return "Disabled";
    default:
      return absl::InvalidArgumentError(absl::StrCat(
          "Unknown syslog TLS mode enum: ", static_cast<int>(tls_mode)));
  }
}

absl::StatusOr<SyslogProtocol> GetSyslogProtocolFromYoctoString(
    absl::string_view protocol) {
  if (protocol == "tcp") {
    return SYSLOG_PROTOCOL_TCP;
  }
  if (protocol == "udp") {
    return SYSLOG_PROTOCOL_UDP;
  }
  return absl::InvalidArgumentError(
      absl::StrCat("Unsupported Yocto syslog protocol: ", protocol));
}

absl::StatusOr<std::string> GetYoctoStringFromSyslogProtocol(
    SyslogProtocol protocol) {
  switch (protocol) {
    case SYSLOG_PROTOCOL_TCP:
      return "tcp";
    case SYSLOG_PROTOCOL_UDP:
      return "udp";
    default:
      return absl::InvalidArgumentError(absl::StrCat(
          "Unknown syslog protocol enum: ", static_cast<int>(protocol)));
  }
}

absl::StatusOr<SyslogTlsMode> GetSyslogTlsModeFromYoctoString(
    absl::string_view tls_mode) {
  if (tls_mode == "tls") {
    return SYSLOG_TLS_MODE_TLS;
  }
  if (tls_mode == "disabled") {
    return SYSLOG_TLS_MODE_DISABLED;
  }
  return absl::InvalidArgumentError(
      absl::StrCat("Unsupported Yocto syslog TLS mode: ", tls_mode));
}

absl::StatusOr<std::string> GetYoctoStringFromSyslogTlsMode(
    SyslogTlsMode tls_mode) {
  switch (tls_mode) {
    case SYSLOG_TLS_MODE_TLS:
      return "tls";
    case SYSLOG_TLS_MODE_DISABLED:
      return "disabled";
    default:
      return absl::InvalidArgumentError(absl::StrCat(
          "Unknown syslog TLS mode enum: ", static_cast<int>(tls_mode)));
  }
}

}  // namespace milotic_tlbmc
