/**
 * @license
 * Copyright 2022-2025 Matter.js Authors
 * SPDX-License-Identifier: Apache-2.0
 */
import { MutableCluster } from "../cluster/mutation/MutableCluster.js";
import { BitFlag } from "../schema/BitmapSchema.js";
import { FixedAttribute, Attribute, WritableAttribute, Command, TlvNoResponse } from "../cluster/Cluster.js";
import { TlvArray } from "../tlv/TlvArray.js";
import { TlvField, TlvOptionalField, TlvObject } from "../tlv/TlvObject.js";
import { TlvString } from "../tlv/TlvString.js";
import { TlvUInt8, TlvEnum } from "../tlv/TlvNumber.js";
import { TlvVendorId } from "../datatype/VendorId.js";
import { ModeBase } from "./mode-base.js";
import { ClusterRegistry } from "../cluster/ClusterRegistry.js";
var RefrigeratorAndTemperatureControlledCabinetMode;
((RefrigeratorAndTemperatureControlledCabinetMode2) => {
  let Feature;
  ((Feature2) => {
    Feature2["OnOff"] = "OnOff";
  })(Feature = RefrigeratorAndTemperatureControlledCabinetMode2.Feature || (RefrigeratorAndTemperatureControlledCabinetMode2.Feature = {}));
  let ModeTag;
  ((ModeTag2) => {
    ModeTag2[ModeTag2["RapidCool"] = 16384] = "RapidCool";
    ModeTag2[ModeTag2["RapidFreeze"] = 16385] = "RapidFreeze";
    ModeTag2[ModeTag2["Auto"] = 0] = "Auto";
    ModeTag2[ModeTag2["Quick"] = 1] = "Quick";
    ModeTag2[ModeTag2["Quiet"] = 2] = "Quiet";
    ModeTag2[ModeTag2["LowNoise"] = 3] = "LowNoise";
    ModeTag2[ModeTag2["LowEnergy"] = 4] = "LowEnergy";
    ModeTag2[ModeTag2["Vacation"] = 5] = "Vacation";
    ModeTag2[ModeTag2["Min"] = 6] = "Min";
    ModeTag2[ModeTag2["Max"] = 7] = "Max";
    ModeTag2[ModeTag2["Night"] = 8] = "Night";
    ModeTag2[ModeTag2["Day"] = 9] = "Day";
  })(ModeTag = RefrigeratorAndTemperatureControlledCabinetMode2.ModeTag || (RefrigeratorAndTemperatureControlledCabinetMode2.ModeTag = {}));
  RefrigeratorAndTemperatureControlledCabinetMode2.TlvModeTagStruct = TlvObject({
    /**
     * If the MfgCode field exists, the Value field shall be in the manufacturer-specific value range (see Section
     * 1.10.8, “Mode Namespace”).
     *
     * This field shall indicate the manufacturer’s VendorID and it shall determine the meaning of the Value field.
     *
     * The same manufacturer code and mode tag value in separate cluster instances are part of the same namespace
     * and have the same meaning. For example: a manufacturer tag meaning "pinch" can be used both in a cluster
     * whose purpose is to choose the amount of sugar, or in a cluster whose purpose is to choose the amount of
     * salt.
     *
     * @see {@link MatterSpecification.v13.Cluster} § 1.10.5.1.1
     */
    mfgCode: TlvOptionalField(0, TlvVendorId),
    /**
     * This field shall indicate the mode tag within a mode tag namespace which is either manufacturer specific or
     * standard.
     *
     * @see {@link MatterSpecification.v13.Cluster} § 1.10.5.1.2
     */
    value: TlvField(1, TlvEnum())
  });
  RefrigeratorAndTemperatureControlledCabinetMode2.TlvModeOption = TlvObject({
    /**
     * This field shall indicate readable text that describes the mode option, so that a client can provide it to
     * the user to indicate what this option means. This field is meant to be readable and understandable by the
     * user.
     *
     * @see {@link MatterSpecification.v13.Cluster} § 1.10.5.2.1
     */
    label: TlvField(0, TlvString.bound({ maxLength: 64 })),
    /**
     * This field is used to identify the mode option.
     *
     * @see {@link MatterSpecification.v13.Cluster} § 1.10.5.2.2
     */
    mode: TlvField(1, TlvUInt8),
    /**
     * This field shall contain a list of tags that are associated with the mode option. This may be used by
     * clients to determine the full or the partial semantics of a certain mode, depending on which tags they
     * understand, using standard definitions and/or manufacturer specific namespace definitions.
     *
     * The standard mode tags are defined in this cluster specification. For the derived cluster instances, if the
     * specification of the derived cluster defines a namespace, the set of standard mode tags also includes the
     * mode tag values from that namespace.
     *
     * Mode tags can help clients look for options that meet certain criteria, render the user interface, use
     *
     * the mode in an automation, or to craft help text their voice-driven interfaces. A mode tag shall be either a
     * standard tag or a manufacturer specific tag, as defined in each ModeTagStruct list entry.
     *
     * A mode option may have more than one mode tag. A mode option may be associated with a mixture of standard
     * and manufacturer specific mode tags. A mode option shall be associated with at least one standard mode tag.
     *
     * A few examples are provided below.
     *
     *   • A mode named "100%" can have both the High (manufacturer specific) and Max (standard) mode tag. Clients
     *     seeking the mode for either High or Max will find the same mode in this case.
     *
     *   • A mode that includes a LowEnergy tag can be displayed by the client using a widget icon that shows a
     *     green leaf.
     *
     *   • A mode that includes a LowNoise tag may be used by the client when the user wishes for a lower level of
     *     audible sound, less likely to disturb the household’s activities.
     *
     *   • A mode that includes a LowEnergy tag (standard, defined in this cluster specification) and also a
     *     Delicate tag (standard, defined in the namespace of a Laundry Mode derived cluster).
     *
     *   • A mode that includes both a generic Quick tag (defined here), and Vacuum and Mop tags, (defined in the
     *     RVC Clean cluster that is a derivation of this cluster).
     *
     * @see {@link MatterSpecification.v13.Cluster} § 1.10.5.2.3
     */
    modeTags: TlvField(2, TlvArray(RefrigeratorAndTemperatureControlledCabinetMode2.TlvModeTagStruct, { maxLength: 8 }))
  });
  RefrigeratorAndTemperatureControlledCabinetMode2.Base = MutableCluster.Component({
    id: 82,
    name: "RefrigeratorAndTemperatureControlledCabinetMode",
    revision: 2,
    features: {
      /**
       * OnOff
       *
       * This feature creates a dependency between an OnOff cluster instance and this cluster instance on the
       * same endpoint. See OnMode for more information.
       *
       * @see {@link MatterSpecification.v13.Cluster} § 1.10.4.1
       */
      onOff: BitFlag(0)
    },
    attributes: {
      /**
       * @see {@link MatterSpecification.v13.Cluster} § 8.7.5
       */
      supportedModes: FixedAttribute(
        0,
        TlvArray(RefrigeratorAndTemperatureControlledCabinetMode2.TlvModeOption, { minLength: 2, maxLength: 255 }),
        { default: [] }
      ),
      /**
       * @see {@link MatterSpecification.v13.Cluster} § 8.7.5
       */
      currentMode: Attribute(1, TlvUInt8, { scene: true, persistent: true }),
      /**
       * @see {@link MatterSpecification.v13.Cluster} § 8.7.5
       */
      startUpMode: WritableAttribute(2, TlvUInt8, { persistent: true }),
      /**
       * @see {@link MatterSpecification.v13.Cluster} § 8.7.5
       */
      onMode: WritableAttribute(3, TlvUInt8, { persistent: true })
    },
    commands: {
      /**
       * This command is used to change device modes.
       *
       * On receipt of this command the device shall respond with a ChangeToModeResponse command.
       *
       * @see {@link MatterSpecification.v13.Cluster} § 1.10.7.1
       */
      changeToMode: Command(0, ModeBase.TlvChangeToModeRequest, 0, TlvNoResponse)
    },
    /**
     * This metadata controls which RefrigeratorAndTemperatureControlledCabinetModeCluster elements matter.js
     * activates for specific feature combinations.
     */
    extensions: MutableCluster.Extensions()
  });
  RefrigeratorAndTemperatureControlledCabinetMode2.ClusterInstance = MutableCluster(RefrigeratorAndTemperatureControlledCabinetMode2.Base);
  RefrigeratorAndTemperatureControlledCabinetMode2.Cluster = RefrigeratorAndTemperatureControlledCabinetMode2.ClusterInstance;
  RefrigeratorAndTemperatureControlledCabinetMode2.Complete = RefrigeratorAndTemperatureControlledCabinetMode2.Cluster;
})(RefrigeratorAndTemperatureControlledCabinetMode || (RefrigeratorAndTemperatureControlledCabinetMode = {}));
const RefrigeratorAndTemperatureControlledCabinetModeCluster = RefrigeratorAndTemperatureControlledCabinetMode.Cluster;
ClusterRegistry.register(RefrigeratorAndTemperatureControlledCabinetMode.Complete);
export {
  RefrigeratorAndTemperatureControlledCabinetMode,
  RefrigeratorAndTemperatureControlledCabinetModeCluster
};
//# sourceMappingURL=refrigerator-and-temperature-controlled-cabinet-mode.js.map
