/** @file
  Metadata Proximity Domain handlers.

  Copyright (c) 2025, Arm Limited. All rights reserved.
  SPDX-License-Identifier: BSD-2-Clause-Patent
**/

#include <Base.h>
#include <Library/BaseLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/DebugLib.h>
#include <Library/MemoryAllocationLib.h>
#include <ConfigurationManagerObject.h>

#include <Library/MetadataObjLib.h>
#include "MetadataHandler.h"

typedef struct ProximityDomainData {
  /// Current Id used for the Proximity Domain Id generation.
  UINT32    CurrentId;
} PROXIMITY_DOMAIN_DATA;

STATIC PROXIMITY_DOMAIN_DATA  mProximityDomainData = {
  0
};

/** Query the MetadataObjLib for metadata matching the input (Type/Token).
    If the metadata exists, return it.
    Otherwise:
    - Generate a new metadata object
    - Add it to the MetadataObjLib
    - return it

  @param[in]       Root          Root of the Metadata information.
  @param[in]       Type          METADATA_TYPE of the entry to generate.
  @param[in]       Token         Token uniquely identifying an entry among other
                                 objects with the input METADATA_TYPE.
  @param[in]       Context       Optional context to use during the Metadata generation.
  @param[in, out]  Metadata      On input, can contain METADATA_TYPE-specific information.
                                 On output and if success, contains the generated
                                 Metadata object.
  @param[in]       MetadataSize  Size of the input Metadata.

  @retval EFI_SUCCESS           Success.
  @retval EFI_INVALID_PARAMETER A parameter is invalid.
**/
EFI_STATUS
EFIAPI
MetadataGenerateProximityDomain (
  IN      METADATA_ROOT_HANDLE  Root,
  IN      METADATA_TYPE         Type,
  IN      CM_OBJECT_TOKEN       Token,
  IN      VOID                  *Context,
  IN OUT  VOID                  *Metadata,
  IN      UINT32                MetadataSize
  )
{
  EFI_STATUS                     Status;
  METADATA_OBJ_PROXIMITY_DOMAIN  *ProximityDomain;

  if ((Type != MetadataTypeProximityDomain)   ||
      (Token == CM_NULL_TOKEN)                ||
      (Metadata == NULL))
  {
    ASSERT (Type == MetadataTypeProximityDomain);
    ASSERT (Token != CM_NULL_TOKEN);
    ASSERT (Metadata != NULL);
    return EFI_INVALID_PARAMETER;
  }

  Status = MetadataGet (Root, Type, Token, Metadata, MetadataSize);
  if (EFI_ERROR (Status) && (Status != EFI_NOT_FOUND)) {
    ASSERT_EFI_ERROR (Status);
    return Status;
  } else if (Status == EFI_SUCCESS) {
    // Metadata for this (Type/Token) already exists.
    return EFI_SUCCESS;
  }

  // Generate new Metadata (i.e. Status == EFI_NOT_FOUND).

  ProximityDomain     = (METADATA_OBJ_PROXIMITY_DOMAIN *)Metadata;
  ProximityDomain->Id = mProximityDomainData.CurrentId++;

  Status = MetadataAdd (Root, Type, Token, Metadata, MetadataSize);
  if (EFI_ERROR (Status)) {
    ASSERT_EFI_ERROR (Status);
    return Status;
  }

  return EFI_SUCCESS;
}

/** Validate the Metadata.

  @param[in]  Root    Root of the Metadata information.

  @retval EFI_SUCCESS           Success.
  @retval EFI_INVALID_PARAMETER A parameter is invalid.
**/
EFI_STATUS
EFIAPI
MetadataValidateProximityDomain (
  IN  METADATA_ROOT_HANDLE  Root
  )
{
  METADATA_HANDLE                Handle0;
  METADATA_HANDLE                Handle1;
  METADATA_OBJ_PROXIMITY_DOMAIN  Metadata0;
  METADATA_OBJ_PROXIMITY_DOMAIN  Metadata1;

  Handle0 = NULL;

  while (TRUE) {
    Handle0 = MetadataIterate (
                Root,
                MetadataTypeProximityDomain,
                Handle0,
                &Metadata0,
                sizeof (METADATA_OBJ_PROXIMITY_DOMAIN)
                );
    if (Handle0 == NULL) {
      break;
    }

    // Loop starting from Handle0
    Handle1 = Handle0;

    while (TRUE) {
      Handle1 = MetadataIterate (
                  Root,
                  MetadataTypeProximityDomain,
                  Handle1,
                  &Metadata1,
                  sizeof (METADATA_OBJ_PROXIMITY_DOMAIN)
                  );

      if (Handle1 == NULL) {
        break;
      }

      if (Metadata0.Id == Metadata1.Id) {
        DEBUG ((
          DEBUG_ERROR,
          "Metadata: ProximityDomain: Same Id: %d\n",
          Metadata0.Id
          ));
        ASSERT (0);
      }
    }
  }

  return EFI_SUCCESS;
}
