{{> header}}
package chip.devicecontroller;

{{#if (chip_has_client_clusters)}}
import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Optional;
{{/if}}

{{! TODO: Use AutoValue for inner classes. }}
public class ChipStructs {
{{#if (chip_has_client_clusters)}}
{{#chip_client_clusters}}
{{#zcl_structs}}
{{#if itemCnt}}
public static class {{asUpperCamelCase parent.name}}Cluster{{asUnderlyingType name}} {
{{#zcl_struct_items}}
{{! TODO: This uses the vague type List<Object> for some list types. }}
public {{asJavaType type null parent.parent.name includeAnnotations=true}} {{asLowerCamelCase (asSymbol label)}};
{{/zcl_struct_items}}

  public {{asUpperCamelCase parent.name}}Cluster{{asUnderlyingType name}}(
  {{#zcl_struct_items}}
    {{#not_first}}, {{/not_first}}{{asJavaType type null parent.parent.name includeAnnotations=true}} {{asLowerCamelCase (asSymbol label)}}
  {{/zcl_struct_items}}) {
    {{#zcl_struct_items}}
    this.{{asLowerCamelCase (asSymbol label)}} = {{asLowerCamelCase (asSymbol label)}};
    {{/zcl_struct_items}}
  }

  @Override
  public String toString() {
    StringBuilder output = new StringBuilder();
    output.append("{{asUpperCamelCase parent.name}}Cluster{{asUnderlyingType name}} {\n");
    {{#zcl_struct_items}}
    {{! TODO: Print more descriptive types for optional, nullable, array, and struct. }}
    output.append("\t{{asLowerCamelCase name}}: ");
    {{#if isArray}}
    output.append({{asLowerCamelCase name}});
    {{else if (isOctetString type)}}
    output.append(Arrays.toString({{asLowerCamelCase name}}));
    {{else}}
    output.append({{asLowerCamelCase name}});
    {{/if}}
    output.append("\n");
    {{/zcl_struct_items}}
    output.append("}\n");
    return output.toString();
  }
}
{{/if}}

{{/zcl_structs}}
{{/chip_client_clusters}}
{{/if}}
}