{{> header}}
package chip.devicecontroller;

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

public class ChipClusters {

  public interface DefaultClusterCallback {
    void onSuccess();
    void onError(Exception error);
  }

  public interface CharStringAttributeCallback {
    /** Indicates a successful read for a CHAR_STRING attribute. */
    void onSuccess(String value);
    void onError(Exception error);
    {{! TODO: use SubscriptionEstablishedCallback instead, here and below. }}
    default void onSubscriptionEstablished(long subscriptionId) {}
  }

  public interface OctetStringAttributeCallback {
    /** Indicates a successful read for an OCTET_STRING attribute. */
    void onSuccess(byte[] value);
    void onError(Exception error);
    default void onSubscriptionEstablished(long subscriptionId) {}
  }

  public interface IntegerAttributeCallback {
    void onSuccess(int value);
    void onError(Exception error);
    default void onSubscriptionEstablished(long subscriptionId) {}
  }

  public interface LongAttributeCallback {
    void onSuccess(long value);
    void onError(Exception error);
    default void onSubscriptionEstablished(long subscriptionId) {}
  }

  public interface BooleanAttributeCallback {
    void onSuccess(boolean value);
    void onError(Exception error);
    default void onSubscriptionEstablished(long subscriptionId) {}
  }

  public interface FloatAttributeCallback {
    void onSuccess(float value);
    void onError(Exception error);
    default void onSubscriptionEstablished(long subscriptionId) {}
  }

  public interface DoubleAttributeCallback {
    void onSuccess(double value);
    void onError(Exception error);
    default void onSubscriptionEstablished(long subscriptionId) {}
  }

  public static abstract class BaseChipCluster {
    protected long chipClusterPtr;

    public BaseChipCluster(long devicePtr, int endpointId) {
      chipClusterPtr = initWithDevice(devicePtr, endpointId);
    }

    /**
     * Sets the timeout, in milliseconds, after which commands sent through this cluster will fail
     * with a timeout (regardless of whether or not a response has been received). If set to an
     * empty optional, the default timeout will be used.
     */
    public void setCommandTimeout(Optional<Long> timeoutMillis) {
      setCommandTimeout(chipClusterPtr, timeoutMillis);
    }

    private native void setCommandTimeout(long clusterPtr, Optional<Long> timeoutMillis);

    /** Returns the current timeout (in milliseconds) for commands sent through this cluster. */
    public Optional<Long> getCommandTimeout() {
      Optional<Long> timeout = getCommandTimeout(chipClusterPtr);
      return timeout == null ? Optional.empty() : timeout;
    }

    private native Optional<Long> getCommandTimeout(long clusterPtr);

    public abstract long initWithDevice(long devicePtr, int endpointId);

    public native void deleteCluster(long chipClusterPtr);
    
    @SuppressWarnings("deprecation")
    protected void finalize() throws Throwable {
      super.finalize();

      if (chipClusterPtr != 0) {
        deleteCluster(chipClusterPtr);
        chipClusterPtr = 0;
      }
    }
  }

  {{#zcl_clusters}}
  public static class {{asUpperCamelCase name}}Cluster extends BaseChipCluster {
    public static final long CLUSTER_ID = {{code}}L;

    public {{asUpperCamelCase name}}Cluster(long devicePtr, int endpointId) {
      super(devicePtr, endpointId);
    }

    @Override
    public native long initWithDevice(long devicePtr, int endpointId);
  {{#all_user_cluster_generated_commands}}
    {{#if_compare clusterId ../id operator='=='}}
      {{#if (is_str_equal commandSource 'client')}}

    {{#unless mustUseTimedInvoke}}
    public void {{asLowerCamelCase name}}({{#if hasSpecificResponse}}{{asUpperCamelCase responseName}}Callback{{else}}DefaultClusterCallback{{/if}} callback
      {{#zcl_command_arguments}}, {{asJavaType type chipType parent.parent.name includeAnnotations=true clusterId=parent.parent.id}} {{asLowerCamelCase label}}{{/zcl_command_arguments}}) {
      {{asLowerCamelCase name}}(chipClusterPtr, callback{{#zcl_command_arguments}}, {{asLowerCamelCase label}}{{/zcl_command_arguments}}, null);
    }
    {{/unless}}

    public void {{asLowerCamelCase name}}({{#if hasSpecificResponse}}{{asUpperCamelCase responseName}}Callback{{else}}DefaultClusterCallback{{/if}} callback
      {{#zcl_command_arguments}}, {{asJavaType type chipType parent.parent.name includeAnnotations=true clusterId=parent.parent.id}} {{asLowerCamelCase label}}{{/zcl_command_arguments}}
      , int timedInvokeTimeoutMs) {
      {{asLowerCamelCase name}}(chipClusterPtr, callback{{#zcl_command_arguments}}, {{asLowerCamelCase label}}{{/zcl_command_arguments}}, timedInvokeTimeoutMs);
    }
      {{/if}}
    {{/if_compare}}
  {{/all_user_cluster_generated_commands}}
  {{#all_user_cluster_generated_commands}}
    {{#if_compare clusterId ../id operator='=='}}
      {{#if (is_str_equal commandSource 'client')}}
    private native void {{asLowerCamelCase name}}(long chipClusterPtr, {{#if hasSpecificResponse}}{{asUpperCamelCase responseName}}Callback{{else}}DefaultClusterCallback{{/if}} Callback
      {{#zcl_command_arguments}}, {{asJavaType type chipType parent.parent.name includeAnnotations=true clusterId=parent.parent.id}} {{asLowerCamelCase label}}{{/zcl_command_arguments}}
      , @Nullable Integer timedInvokeTimeoutMs);
      {{/if}}
    {{/if_compare}}
  {{/all_user_cluster_generated_commands}}
    {{#all_user_cluster_generated_commands}}
      {{#if_compare clusterId ../id operator='=='}}
        {{#if (is_str_equal commandSource 'server')}}
    public interface {{asUpperCamelCase name}}Callback {
      void onSuccess({{#zcl_command_arguments}}{{#not_first}}, {{/not_first}}{{asJavaType type chipType parent.parent.name includeAnnotations=true clusterId=parent.parent.id}} {{asLowerCamelCase label}}{{/zcl_command_arguments}});
      
      void onError(Exception error);
    }

        {{/if}}
    {{/if_compare}}
  {{/all_user_cluster_generated_commands}}

  {{#zcl_attributes_server removeKeys='isOptional'}}
  {{#if_unsupported_attribute_callback type isArray ../id}}
  {{else}}
  {{#if_basic_attribute type ../id}}
  {{else}}
    {{! NOTE: asJavaType ends up sniffing for isArray on the context. Since we want the type of our _entry_, force isArray to
          false. }}
    {{~#*inline "asJavaTypeForEntry"}}{{asJavaType type null parent.name forceNotList=true}}{{/inline~}}
    {{#if isArray}}
      public interface {{asUpperCamelCase name}}AttributeCallback {
        void onSuccess({{#if isNullable}}@Nullable{{/if}} List<{{>asJavaTypeForEntry isArray=false}}> valueList);
        void onError(Exception ex);
        default void onSubscriptionEstablished(long subscriptionId) {}
      }
    {{else}}
      public interface {{asUpperCamelCase name}}AttributeCallback {
        void onSuccess({{#if isNullable}}@Nullable{{/if}} {{>asJavaTypeForEntry isArray=false}} value);
        void onError(Exception ex);
        default void onSubscriptionEstablished(long subscriptionId) {}
      }
    {{/if}}
  {{/if_basic_attribute}}
  {{/if_unsupported_attribute_callback}}
  {{/zcl_attributes_server}}
  {{#zcl_attributes_server removeKeys='isOptional'}}
  {{! TODO: Add support for struct-typed attributes }}
  {{#if_unsupported_attribute_callback type isArray ../id}}
  {{else}}

    public void read{{asUpperCamelCase name}}Attribute(
    {{#if_basic_attribute type ../id}}
      {{as_underlying_java_zcl_type type ../id boolean="Boolean"}}AttributeCallback callback
    {{else}}
      {{asUpperCamelCase name}}AttributeCallback callback
    {{/if_basic_attribute}}
    ) {
      read{{asUpperCamelCase name}}Attribute(chipClusterPtr, callback);
    }
  {{#if isWritableAttribute}}
    {{#unless mustUseTimedWrite}}
    public void write{{asUpperCamelCase name}}Attribute(DefaultClusterCallback callback, {{asJavaType type chipType parent.name}} value) {
      write{{asUpperCamelCase name}}Attribute(chipClusterPtr, callback, value, null);
    }
    {{/unless}}

    public void write{{asUpperCamelCase name}}Attribute(DefaultClusterCallback callback, {{asJavaType type chipType parent.name}} value, int timedWriteTimeoutMs) {
      write{{asUpperCamelCase name}}Attribute(chipClusterPtr, callback, value, timedWriteTimeoutMs);
    }
  {{/if}}
  {{#if isReportableAttribute}}
    public void subscribe{{asCamelCased name false}}Attribute(
      {{#if_basic_attribute type ../id}}
        {{as_underlying_java_zcl_type type ../id boolean="Boolean"}}AttributeCallback callback
      {{else}}
        {{asUpperCamelCase name}}AttributeCallback callback
      {{/if_basic_attribute}},
      int minInterval, int maxInterval) {
      subscribe{{asCamelCased name false}}Attribute(chipClusterPtr, callback, minInterval, maxInterval);
    }
  {{/if}}
  {{/if_unsupported_attribute_callback}}
  {{/zcl_attributes_server}}
  {{#zcl_attributes_server removeKeys='isOptional'}}
  {{! TODO: Add support for struct-typed attributes }}
  {{#if_unsupported_attribute_callback type isArray ../id }}
  {{else}}

    private native void read{{asUpperCamelCase name}}Attribute(long chipClusterPtr,
      {{#if_basic_attribute type ../id}}
        {{as_underlying_java_zcl_type type ../id boolean="Boolean"}}AttributeCallback callback
      {{else}}
        {{asUpperCamelCase name}}AttributeCallback callback
      {{/if_basic_attribute}}
    );
  {{#if isWritableAttribute}}

    private native void write{{asUpperCamelCase name}}Attribute(long chipClusterPtr, DefaultClusterCallback callback, {{asJavaType type chipType parent.name}} value, @Nullable Integer timedWriteTimeoutMs);
  {{/if}}
  {{#if isReportableAttribute}}
    private native void subscribe{{asCamelCased name false}}Attribute(long chipClusterPtr,
      {{#if_basic_attribute type ../id}}
        {{as_underlying_java_zcl_type type ../id boolean="Boolean"}}AttributeCallback callback
      {{else}}
        {{asUpperCamelCase name}}AttributeCallback callback
      {{/if_basic_attribute}}, int minInterval, int maxInterval);
  {{/if}}
  {{/if_unsupported_attribute_callback}}
  {{/zcl_attributes_server}}
  }
  {{#not_last}}

  {{/not_last}}
  {{/zcl_clusters}}
}

