/** @file
  This file is cloned from DMTF libredfish library tag v1.0.0 and maintained
  by EDKII.

//----------------------------------------------------------------------------
// Copyright Notice:
// Copyright 2017 Distributed Management Task Force, Inc. All rights reserved.
// License: BSD 3-Clause License. For full text see link: https://github.com/DMTF/libredfish/LICENSE.md
//----------------------------------------------------------------------------

  Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
  (C) Copyright 2021 Hewlett Packard Enterprise Development LP<BR>
  Copyright (c) 2023, NVIDIA CORPORATION & AFFILIATES. All rights reserved.

  SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#ifndef LIBREDFISH_REDFISH_SERVICE_H_
#define LIBREDFISH_REDFISH_SERVICE_H_

#include <IndustryStandard/Http11.h>

#include <Library/BaseLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/DebugLib.h>
#include <Library/HttpLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Library/NetLib.h>
#include <Library/RedfishContentCodingLib.h>
#include <Library/UefiRuntimeServicesTableLib.h>
#include <Library/UefiBootServicesTableLib.h>

#include <Include/Library/RedfishCrtLib.h>

#include <Protocol/EdkIIRedfishConfigHandler.h>
#include <Protocol/RestEx.h>

#include <jansson.h>

typedef struct {
  char                    *host;
  json_t                  *versions;
  unsigned int            flags;
  char                    *sessionToken;
  char                    *basicAuthStr;
  //
  // point to the <HOST> part in above "host" field, which will be put into
  // the "Host" header of HTTP request message.
  //
  char                    *HostHeaderValue;
  EFI_REST_EX_PROTOCOL    *RestEx;
} redfishService;

typedef struct {
  json_t            *json;
  redfishService    *service;
} redfishPayload;

#define REDFISH_AUTH_BASIC         0
#define REDFISH_AUTH_BEARER_TOKEN  1
#define REDFISH_AUTH_SESSION       2

#define REDFISH_HTTP_RESPONSE_TIMEOUT  5000       /// 5 seconds in uints of millisecond.

///
/// Library class public defines
///
#define HTTP_FLAG   L"http://"
#define HTTPS_FLAG  L"https://"

///
/// The redfish first URL should be "/redfish/v1/", while we use "/redfish/v1" here without "/"
/// in the end is to avoid the 301 Perment redirect response from Redfish profile simulator.
///
#define REDFISH_FIRST_URL  L"/redfish/v1"

typedef struct {
  unsigned int    authType;
  union {
    struct {
      char    *username;
      char    *password;
    } userPass;
    struct {
      char    *token;
    } authToken;
  } authCodes;
} enumeratorAuthentication;

// Values for flags
#define REDFISH_FLAG_SERVICE_NO_VERSION_DOC  0x00000001// The Redfish Service lacks the version document (in violation of the Redfish spec)
redfishService *
createServiceEnumerator (
  REDFISH_CONFIG_SERVICE_INFORMATION  *RedfishConfigServiceInfo,
  const char                          *rootUri,
  enumeratorAuthentication            *auth,
  unsigned int                        flags
  );

json_t *
getUriFromService (
  redfishService        *service,
  const char            *uri,
  EFI_HTTP_STATUS_CODE  **StatusCode
  );

json_t *
getUriFromServiceEx (
  redfishService        *service,
  const char            *uri,
  EFI_HTTP_HEADER       **Headers,
  UINTN                 *HeaderCount,
  EFI_HTTP_STATUS_CODE  **StatusCode
  );

json_t *
patchUriFromService (
  redfishService        *service,
  const char            *uri,
  const char            *content,
  EFI_HTTP_STATUS_CODE  **StatusCode
  );

json_t *
patchUriFromServiceEx (
  redfishService        *service,
  const char            *uri,
  const char            *content,
  EFI_HTTP_HEADER       **Headers,
  UINTN                 *HeaderCount,
  EFI_HTTP_STATUS_CODE  **StatusCode
  );

json_t *
postUriFromService (
  redfishService        *service,
  const char            *uri,
  const char            *content,
  size_t                contentLength,
  const char            *contentType,
  EFI_HTTP_STATUS_CODE  **StatusCode
  );

json_t *
postUriFromServiceEx (
  redfishService        *service,
  const char            *uri,
  const char            *content,
  size_t                contentLength,
  const char            *contentType,
  EFI_HTTP_HEADER       **Headers,
  UINTN                 *HeaderCount,
  EFI_HTTP_STATUS_CODE  **StatusCode
  );

json_t *
putUriFromServiceEx (
  redfishService        *service,
  const char            *uri,
  const char            *content,
  size_t                contentLength,
  const char            *contentType,
  EFI_HTTP_HEADER       **Headers,
  UINTN                 *HeaderCount,
  EFI_HTTP_STATUS_CODE  **StatusCode
  );

json_t *
deleteUriFromService (
  redfishService        *service,
  const char            *uri,
  EFI_HTTP_STATUS_CODE  **StatusCode
  );

json_t *
deleteUriFromServiceEx (
  redfishService        *service,
  const char            *uri,
  const char            *content,
  EFI_HTTP_STATUS_CODE  **StatusCode
  );

redfishPayload *
getRedfishServiceRoot (
  redfishService        *service,
  const char            *version,
  EFI_HTTP_STATUS_CODE  **StatusCode
  );

redfishPayload *
getPayloadByPath (
  redfishService        *service,
  const char            *path,
  EFI_HTTP_STATUS_CODE  **StatusCode
  );

void
cleanupServiceEnumerator (
  redfishService  *service
  );

#endif
