/** @file
  Metadata Handler Library.

  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"

/* Metadata handlers. */
STATIC METADATA_HANDLERS  mMetadataHandlers[MetadataTypeMax] = {
  // MetadataTypeUid
  {
    MetadataGenerateUid,
    MetadataValidateUid,
  },
  // MetadataTypeProximityDomain
  {
    MetadataGenerateProximityDomain,
    MetadataValidateProximityDomain,
  },
};

/** 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
MetadataHandlerGenerate (
  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;

  if ((Type >= MetadataTypeMax) ||
      (Token == CM_NULL_TOKEN)  ||
      (Metadata == NULL)        ||
      (MetadataSize == 0))
  {
    ASSERT (Type < MetadataTypeMax);
    ASSERT (Token != CM_NULL_TOKEN);
    ASSERT (Metadata != NULL);
    ASSERT (MetadataSize != 0);
    return EFI_INVALID_PARAMETER;
  }

  Status = mMetadataHandlers[Type].Generate (
                                     Root,
                                     Type,
                                     Token,
                                     Context,
                                     Metadata,
                                     MetadataSize
                                     );
  ASSERT_EFI_ERROR (Status);

  return Status;
}

/** 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
MetadataHandlerValidate (
  IN  METADATA_ROOT_HANDLE  Root
  )
{
  EFI_STATUS     Status;
  METADATA_TYPE  Type;

  for (Type = 0; Type < MetadataTypeMax; Type++) {
    Status = mMetadataHandlers[Type].Validate (Root);
    ASSERT_EFI_ERROR (Status);
  }

  return Status;
}
