"use strict";
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
  for (var name in all)
    __defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
  if (from && typeof from === "object" || typeof from === "function") {
    for (let key of __getOwnPropNames(from))
      if (!__hasOwnProp.call(to, key) && key !== except)
        __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
  }
  return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var mode_base_exports = {};
__export(mode_base_exports, {
  ModeBase: () => ModeBase
});
module.exports = __toCommonJS(mode_base_exports);
var import_MutableCluster = require("../cluster/mutation/MutableCluster.js");
var import_Cluster = require("../cluster/Cluster.js");
var import_TlvNumber = require("../tlv/TlvNumber.js");
var import_TlvNullable = require("../tlv/TlvNullable.js");
var import_BitmapSchema = require("../schema/BitmapSchema.js");
var import_TlvArray = require("../tlv/TlvArray.js");
var import_TlvObject = require("../tlv/TlvObject.js");
var import_TlvString = require("../tlv/TlvString.js");
var import_VendorId = require("../datatype/VendorId.js");
/**
 * @license
 * Copyright 2022-2026 Matter.js Authors
 * SPDX-License-Identifier: Apache-2.0
 */
var ModeBase;
((ModeBase2) => {
  let Feature;
  ((Feature2) => {
    Feature2["OnOff"] = "OnOff";
  })(Feature = ModeBase2.Feature || (ModeBase2.Feature = {}));
  let ModeTag;
  ((ModeTag2) => {
    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 = ModeBase2.ModeTag || (ModeBase2.ModeTag = {}));
  ModeBase2.TlvModeTagStruct = (0, import_TlvObject.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.v142.Cluster} § 1.10.5.1.1
     */
    mfgCode: (0, import_TlvObject.TlvOptionalField)(0, import_VendorId.TlvVendorId),
    /**
     * This field shall indicate the mode tag within a mode tag namespace which is either manufacturer specific or
     * standard.
     *
     * @see {@link MatterSpecification.v142.Cluster} § 1.10.5.1.2
     */
    value: (0, import_TlvObject.TlvField)(1, (0, import_TlvNumber.TlvEnum)())
  });
  ModeBase2.TlvModeOption = (0, import_TlvObject.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.v142.Cluster} § 1.10.5.2.1
     */
    label: (0, import_TlvObject.TlvField)(0, import_TlvString.TlvString.bound({ maxLength: 64 })),
    /**
     * This field is used to identify the mode option.
     *
     * @see {@link MatterSpecification.v142.Cluster} § 1.10.5.2.2
     */
    mode: (0, import_TlvObject.TlvField)(1, import_TlvNumber.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.
     *
     * Each mode tag in this field shall be distinct from other mode tags in this field. For example, a simplified
     * list containing [Auto, Auto] would not be allowed.
     *
     * 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.v142.Cluster} § 1.10.5.2.3
     */
    modeTags: (0, import_TlvObject.TlvField)(2, (0, import_TlvArray.TlvArray)(ModeBase2.TlvModeTagStruct, { maxLength: 8 }))
  });
  ModeBase2.TlvChangeToModeRequest = (0, import_TlvObject.TlvObject)({
    /**
     * If the NewMode field doesn’t match the Mode field of any entry of the SupportedModes list, the
     * ChangeToModeResponse command’s Status field shall indicate UnsupportedMode and the StatusText field shall be
     * included and may be used to indicate the issue, with a human readable string, or include an empty string.
     *
     * If the NewMode field matches the Mode field of one entry of the SupportedModes list, but the device is not
     * able to transition as requested, the ChangeToModeResponse command shall:
     *
     *   - Have the Status set to a product-specific Status value representing the error, or GenericFailure if a
     *     more specific error cannot be provided. See Status field for details.
     *
     *   - Provide a human readable string in the StatusText field.
     *
     * If the NewMode field matches the Mode field of one entry of the SupportedModes list and the device is able to
     * transition as requested, the server shall transition into the mode associated with NewMode, the
     * ChangeToModeResponse command shall have the Status field set to Success, the StatusText field may be supplied
     * with a human readable string or include an empty string and the CurrentMode field shall be set to the value
     * of the NewMode field.
     *
     * If the NewMode field is the same as the value of the CurrentMode attribute the ChangeToModeResponse command
     * shall have the Status field set to Success and the StatusText field may be supplied with a human readable
     * string or include an empty string.
     *
     * @see {@link MatterSpecification.v142.Cluster} § 1.10.7.1.1
     */
    newMode: (0, import_TlvObject.TlvField)(0, import_TlvNumber.TlvUInt8)
  });
  let ModeChangeStatus;
  ((ModeChangeStatus2) => {
    ModeChangeStatus2[ModeChangeStatus2["Success"] = 0] = "Success";
    ModeChangeStatus2[ModeChangeStatus2["UnsupportedMode"] = 1] = "UnsupportedMode";
    ModeChangeStatus2[ModeChangeStatus2["GenericFailure"] = 2] = "GenericFailure";
    ModeChangeStatus2[ModeChangeStatus2["InvalidInMode"] = 3] = "InvalidInMode";
  })(ModeChangeStatus = ModeBase2.ModeChangeStatus || (ModeBase2.ModeChangeStatus = {}));
  ModeBase2.TlvChangeToModeResponse = (0, import_TlvObject.TlvObject)({
    /**
     * @see {@link MatterSpecification.v142.Cluster} § 1.10.7.2.1
     */
    status: (0, import_TlvObject.TlvField)(0, (0, import_TlvNumber.TlvEnum)()),
    statusText: (0, import_TlvObject.TlvField)(1, import_TlvString.TlvString.bound({ maxLength: 64 }))
  });
  ModeBase2.OnOffComponent = import_MutableCluster.MutableCluster.Component({
    attributes: {
      /**
       * Indicates whether the value of CurrentMode depends on the state of the On/Off cluster on the same
       * endpoint. If this attribute is not present or is set to null, there is no dependency, otherwise the
       * CurrentMode attribute shall depend on the OnOff attribute in the On/Off cluster
       *
       * The value of this field shall match the Mode field of one of the entries in the SupportedModes attribute.
       *
       * @see {@link MatterSpecification.v142.Cluster} § 1.10.6.4
       */
      onMode: (0, import_Cluster.WritableAttribute)(3, (0, import_TlvNullable.TlvNullable)(import_TlvNumber.TlvUInt8), { persistent: true })
    }
  });
  ModeBase2.Base = import_MutableCluster.MutableCluster.Component({
    features: {
      /**
       * 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.v142.Cluster} § 1.10.4.1
       */
      onOff: (0, import_BitmapSchema.BitFlag)(0)
    },
    name: "ModeBase",
    revision: 2,
    attributes: {
      /**
       * This attribute shall contain the list of supported modes that may be selected for the CurrentMode
       * attribute. Each item in this list represents a unique mode as indicated by the Mode field of the
       * ModeOptionStruct.
       *
       * Each entry in this list shall have a unique value for the Mode field.
       *
       * Each entry in this list shall have a unique value for the Label field.
       *
       * The set of ModeTags listed in each entry in this list shall be distinct from the sets of ModeTags listed
       * in the other entries. This comparison shall NOT depend on the order of the ModeTags in the lists. Two
       * sets shall be considered distinct if one of them contains an element that the other one does not. Note
       * that the two sets could have a non-empty intersection, or one could be a subset of the other, and still
       * be distinct.
       *
       * Simplified examples of allowed ModeTags lists:
       *
       * Simplified examples of disallowed ModeTags lists:
       *
       * @see {@link MatterSpecification.v142.Cluster} § 1.10.6.1
       */
      supportedModes: (0, import_Cluster.FixedAttribute)(0, (0, import_TlvArray.TlvArray)(ModeBase2.TlvModeOption, { minLength: 2, maxLength: 255 })),
      /**
       * Indicates the current mode of the server.
       *
       * The value of this field shall match the Mode field of one of the entries in the SupportedModes attribute.
       *
       * The value of this attribute may change at any time via an out-of-band interaction outside of the server,
       * such as interactions with a user interface, via internal mode changes due to autonomously progressing
       * through a sequence of operations, on system time-outs or idle delays, or via interactions coming from a
       * fabric other than the one which last executed a ChangeToMode.
       *
       * @see {@link MatterSpecification.v142.Cluster} § 1.10.6.2
       */
      currentMode: (0, import_Cluster.Attribute)(1, import_TlvNumber.TlvUInt8, { persistent: true }),
      /**
       * Indicates the desired startup mode for the server when it is supplied with power.
       *
       * If this attribute is not null, the CurrentMode attribute shall be set to the StartUpMode value, when the
       * server is powered up, except in the case when the OnMode attribute overrides the StartUpMode attribute
       * (see Section 1.10.6.4.1, “OnMode with Power Up”).
       *
       * This behavior does not apply to reboots associated with OTA. After an OTA restart, the CurrentMode
       * attribute shall return to its value prior to the restart.
       *
       * The value of this field shall match the Mode field of one of the entries in the SupportedModes attribute.
       *
       * If this attribute is not implemented, or is set to the null value, it shall have no effect.
       *
       * @see {@link MatterSpecification.v142.Cluster} § 1.10.6.3
       */
      startUpMode: (0, import_Cluster.OptionalWritableAttribute)(2, (0, import_TlvNullable.TlvNullable)(import_TlvNumber.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.v142.Cluster} § 1.10.7.1
       */
      changeToMode: (0, import_Cluster.Command)(0, ModeBase2.TlvChangeToModeRequest, 1, ModeBase2.TlvChangeToModeResponse)
    },
    /**
     * This metadata controls which ModeBaseCluster elements matter.js activates for specific feature combinations.
     */
    extensions: import_MutableCluster.MutableCluster.Extensions({ flags: { onOff: true }, component: ModeBase2.OnOffComponent })
  });
  const DEPONOFF = { onOff: true };
  ModeBase2.CompleteInstance = import_MutableCluster.MutableCluster.Component({
    name: ModeBase2.Base.name,
    revision: ModeBase2.Base.revision,
    features: ModeBase2.Base.features,
    attributes: {
      ...ModeBase2.Base.attributes,
      onMode: import_MutableCluster.MutableCluster.AsConditional(ModeBase2.OnOffComponent.attributes.onMode, { mandatoryIf: [DEPONOFF] })
    },
    commands: ModeBase2.Base.commands
  });
  ModeBase2.Complete = ModeBase2.CompleteInstance;
})(ModeBase || (ModeBase = {}));
//# sourceMappingURL=mode-base.js.map
