{{> header}}
{{#if (chip_has_client_clusters)}}

package chip.devicecontroller;

import chip.clusterinfo.CommandParameterInfo;
import chip.clusterinfo.InteractionInfo;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

public class ClusterReadMapping {

  public Map<String, Map<String, InteractionInfo>> getReadAttributeMap() {
    Map<String, Map<String, InteractionInfo>> readAttributeMap = new HashMap<>();
    {{#chip_client_clusters}}
       Map<String, InteractionInfo> read{{asUpperCamelCase name}}InteractionInfo = new LinkedHashMap<>();
        {{#chip_server_cluster_attributes}}
        {{! TODO: Add support for struct-typed attributes }}
        {{#unless (isStrEqual chipCallback.name "Unsupported")}}
        Map<String, CommandParameterInfo> read{{asUpperCamelCase ../name}}{{asUpperCamelCase name}}CommandParams = new LinkedHashMap<String, CommandParameterInfo>();
        InteractionInfo read{{asUpperCamelCase ../name}}{{asUpperCamelCase name}}AttributeInteractionInfo = new InteractionInfo(
          (cluster, callback, commandArguments) -> {
            ((ChipClusters.{{asUpperCamelCase ../name}}Cluster) cluster).read{{asUpperCamelCase name}}Attribute(
              ({{#if_basic_global_response}}
                ChipClusters.{{convertAttributeCallbackTypeToJavaName chipCallback.type}}AttributeCallback
              {{else}}
                ChipClusters.{{asUpperCamelCase ../name}}Cluster.{{asUpperCamelCase name}}AttributeCallback
              {{/if_basic_global_response}}) callback
            );
          },
          {{#if isArray}}
            () -> new ClusterInfoMapping.Delegated{{asUpperCamelCase parent.name}}Cluster{{asUpperCamelCase name}}AttributeCallback(),
          {{else}}
            () -> new ClusterInfoMapping.Delegated{{convertAttributeCallbackTypeToJavaName chipCallback.type}}AttributeCallback(),
          {{/if}}
          read{{asUpperCamelCase ../name}}{{asUpperCamelCase name}}CommandParams
        );
        read{{asUpperCamelCase ../name}}InteractionInfo.put("read{{asUpperCamelCase name}}Attribute", read{{asUpperCamelCase ../name}}{{asUpperCamelCase name}}AttributeInteractionInfo);
        {{/unless}}
        {{/chip_server_cluster_attributes}}
        readAttributeMap.put("{{asLowerCamelCase name}}", read{{asUpperCamelCase name}}InteractionInfo);
        {{/chip_client_clusters}}
        return readAttributeMap;
  }
}

{{/if}}