#include <app-common/zap-generated/cluster-id.h>
#include <app-common/zap-generated/attribute-id.h>

#include <new>

#include "bridge/BridgeGlobalStructs.h"

namespace clusters {

{%- for cluster in clusters %}
{%-   if cluster | dynamicCluster(idl) %}
struct {{cluster.name}}Cluster : public CommonCluster
{
  {%-   for struct in cluster.structs %}
  {%-     if struct.tag == None %}
  struct {{struct.name}}
  {
    CHIP_ERROR Decode(chip::TLV::TLVReader & reader);
    CHIP_ERROR Encode(chip::TLV::TLVWriter & writer, chip::TLV::Tag tag) const;

    {%-      for field in struct.fields %}
    {{field | getField(cluster, idl)}} {{field.name}};
    {%-      endfor  %}
  };
  {%-     endif %}
  {%-   endfor %}

  static constexpr chip::ClusterId kClusterId = {{cluster.code}};

  chip::ClusterId GetClusterId() override { return kClusterId; }

  CHIP_ERROR WriteFromBridge(const chip::app::ConcreteDataAttributePath & aPath, chip::app::AttributeValueDecoder & aDecoder) override;

  template<typename T>
  void AddAllAttributes(T *list)
  {
  {%-  for attr in cluster.attributes %}
    list->Add(m{{attr.definition.name | capitalcase}});
  {%-  endfor  %}
  }

  chip::Span<const EmberAfAttributeMetadata> GetAllAttributes() override;

{%  for attr in cluster.attributes %}
  Attribute<{{attr.definition.code}}, {{attr | getMask(cluster, idl)}}, {{attr | getType(cluster, idl)}}> m{{attr.definition.name | capitalcase}}{{attr | getInit(cluster, idl)}};
{%-  endfor  %}
};

struct {{cluster.name}}Access : public CommonAttributeAccessInterface
{
  {{cluster.name}}Access();

  {{cluster.name}}Cluster* GetCluster(const chip::app::ConcreteClusterPath & aPath)
  {
    CommonCluster * cluster = FindCluster(aPath);
    return cluster ? static_cast<{{cluster.name}}Cluster*>(cluster) : nullptr;
  }

  CHIP_ERROR Read(const chip::app::ConcreteReadAttributePath & aPath, chip::app::AttributeValueEncoder & aEncoder) override;
  CHIP_ERROR Write(const chip::app::ConcreteDataAttributePath & aPath, chip::app::AttributeValueDecoder & aDecoder) override;
  void OnListWriteBegin(const chip::app::ConcreteAttributePath & aPath) override;
  void OnListWriteEnd(const chip::app::ConcreteAttributePath & aPath, bool aWriteWasSuccessful) override;
};
{%-   endif %}
{%- endfor %}

}
