/** @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

**/

#pragma once

#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
  );
