{{> header}}
package chip.devicecontroller;

import javax.annotation.Nullable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Optional;

{{! TODO: Use AutoValue for inner classes. }}
public class ChipStructs {
{{#zcl_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}}
{{/zcl_clusters}}
}