/**
 * @license
 * Copyright 2022-2026 Matter.js Authors
 * SPDX-License-Identifier: Apache-2.0
 */

/*** THIS FILE IS GENERATED, DO NOT EDIT ***/

import type { ClusterType, ClusterTyping } from "../cluster/ClusterType.js";
import type { ClusterId } from "../datatype/ClusterId.js";
import type { ClusterModel } from "@matter/model";
import type { MaybePromise } from "@matter/general";
import type { Locationdesc } from "../globals/Locationdesc.js";

/**
 * Definitions for the ServiceArea cluster.
 *
 * This cluster provides an interface for controlling the areas where a device should operate, for reporting the status
 * at each area, and for querying the current area.
 *
 * The device may operate at one area at a time, as in the case of a mobile device, such as a robot. Other devices may
 * operate at (service) multiple areas simultaneously, as in the case of a sensor that can monitor multiple areas. This
 * cluster specification uses the term "operate" to describe both the operating and servicing actions, regardless of the
 * device type.
 *
 * The cluster allows the client to select one or more areas on the server, to indicate where the device SHOULD attempt
 * to operate. An area is one of a list of options that may be presented by a client for a user choice, or understood by
 * the client, via the semantic data of the area.
 *
 * The area semantic data is a combination of semantic tags, indicating one or more of the following: the building
 * floor, area type, landmark, and relative position.
 *
 * @see {@link MatterSpecification.v142.Cluster} § 1.17
 */
export declare namespace ServiceArea {
    /**
     * The Matter protocol cluster identifier.
     */
    export const id: ClusterId & 0x0150;

    /**
     * Textual cluster identifier.
     */
    export const name: "ServiceArea";

    /**
     * The cluster revision assigned by {@link MatterSpecification.v142.Cluster}.
     */
    export const revision: 2;

    /**
     * Canonical metadata for the ServiceArea cluster.
     *
     * This is the exhaustive runtime metadata source that matter.js considers canonical.
     */
    export const schema: ClusterModel;

    /**
     * {@link ServiceArea} always supports these elements.
     */
    export interface BaseAttributes {
        /**
         * This attribute shall contain the list of areas that can be included in the SelectedAreas attribute’s list.
         * Each item in this list represents a unique area, as indicated by the AreaID field of AreaStruct.
         *
         * Each entry in this list shall have a unique value for the AreaID field.
         *
         * If the SupportedMaps attribute is not empty, each entry in this list shall have a unique value for the
         * combination of the MapID and AreaInfo fields.
         *
         * If the SupportedMaps attribute is empty, each entry in this list shall have a unique value for the AreaInfo
         * field and shall have the MapID field set to null.
         *
         * An empty value indicates that the device is currently unable to provide the list of supported areas.
         *
         * > [!NOTE]
         *
         * > due to the maximum size of this list and to the fact that the entries may include strings (see
         *   LocationName), care must be taken by implementers to avoid creating a data structure that is overly large,
         *   which can result in significant latency in accessing this 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, or due to internal device changes.
         *
         * When removing entries in the SupportedAreas attribute list the server shall adjust the values of the
         * SelectedAreas, CurrentArea, and Progress attributes such that they only reference valid entries in the
         * updated SupportedAreas attribute list. These changes to the SelectedAreas, CurrentArea, and Progress
         * attributes may result in the server setting some or all of them to empty (for SelectedAreas and Progress) or
         * null (for CurrentArea), or updating them with data that matches the constraints from the description of the
         * respective attributes. These actions are required to ensure having a consistent representation of the maps
         * and locations available to the clients.
         *
         * The SupportedAreas attribute list changes mentioned above SHOULD NOT be allowed while the device is
         * operating, to reduce the impact on the clients, and the potential confusion for the users.
         *
         * A few examples are provided below.
         *
         * Valid list of areas:
         *
         *   - AreaID=0, LocationName="yellow bedroom", MapID=null
         *
         *   - AreaID=1, LocationName="orange bedroom", MapID=null
         *
         * Valid list of areas:
         *
         *   - AreaID=5, LocationName="hallway", MapID=1
         *
         *   - AreaID=3, LocationName="hallway", MapID=2
         *
         * @see {@link MatterSpecification.v142.Cluster} § 1.17.6.1
         */
        supportedAreas: Area[];

        /**
         * Indicates the set of areas where the device SHOULD attempt to operate.
         *
         * The mobile devices may travel without operating across any areas while attempting to reach the areas
         * indicated by the SelectedAreas attribute. For example, a robotic vacuum cleaner may drive without cleaning
         * when traveling without operating.
         *
         * If this attribute is empty, the device is not constrained to operate in any specific areas.
         *
         * If this attribute is not empty:
         *
         *   - each item in this list shall match the AreaID field of an entry in the SupportedAreas attribute’s list
         *
         *   - each entry in this list shall have a unique value
         *
         * @see {@link MatterSpecification.v142.Cluster} § 1.17.6.3
         */
        selectedAreas: number[];

        /**
         * If the device is mobile, this attribute shall indicate the area where the device is currently located,
         * regardless of whether it is operating or not, such as while traveling between areas.
         *
         * If the device is not mobile and can operate at multiple areas sequentially, this attribute shall indicate the
         * area which is currently being serviced, or the area which is currently traversed by the device. For example,
         * a camera device may use this attribute to indicate which area it currently takes video of (serviced area) or
         * which area it currently has in view but not taking video of (e.g. an area which is traversed while panning).
         *
         * > [!NOTE]
         *
         * > A device may traverse an area regardless of the status of the area (pending, skipped, or completed).
         *
         * If a device can simultaneously operate at multiple areas, such as in the case of a sensor that can monitor
         * multiple areas at the same time, the CurrentArea attribute shall NOT be implemented, since it doesn’t apply.
         * Else this attribute shall be optionally implemented.
         *
         * A null value indicates that the device is currently unable to provide this information. For example, the
         * device is traversing an unknown area, or the SupportedAreas attribute was updated and the area where the
         * device is located was removed from that list.
         *
         * If not null, the value of this attribute shall match the AreaID field of an entry on the SupportedAreas
         * attribute’s list.
         *
         * @see {@link MatterSpecification.v142.Cluster} § 1.17.6.4
         */
        currentArea?: number | null;

        /**
         * Indicates the estimated Epoch time for completing operating at the area indicated by the CurrentArea
         * attribute, in seconds.
         *
         * A value of 0 means that the operation has completed.
         *
         * When this attribute is null, that represents that there is no time currently defined until operation
         * completion. This may happen, for example, because no operation is in progress or because the completion time
         * is unknown.
         *
         * Null if the CurrentArea attribute is null.
         *
         * If the Progress attribute is available, and it contains an entry matching CurrentArea, the server may use the
         * time estimate provided in the EstimatedTime field of that entry to compute the EstimatedEndTime attribute.
         *
         * The value of this attribute shall only be reported in the following cases:
         *
         *   - when it changes to or from 0
         *
         *   - when it decreases
         *
         *   - when it changes to or from null
         *
         *     > [!NOTE]
         *
         *     > If the device is capable of pausing its operation, this attribute may be set to null, to indicate that
         *       completion time is unknown, or increment the value while being in the paused state.
         *
         * @see {@link MatterSpecification.v142.Cluster} § 1.17.6.5
         */
        estimatedEndTime?: number | null;
    }

    /**
     * {@link ServiceArea} supports these elements if it supports feature "Maps".
     */
    export interface MapsAttributes {
        /**
         * This attribute shall contain the list of supported maps.
         *
         * A map is a full or a partial representation of a home, known to the device. For example:
         *
         *   - a single level home may be represented using a single map
         *
         *   - a two level home may be represented using two maps, one for each level
         *
         *   - a single level home may be represented using two maps, each including a different set of rooms, such as
         *     "map of living room and kitchen" and "map of bedrooms and hallway"
         *
         *   - a single level home may be represented using one map for the indoor areas (living room, bedrooms etc.)
         *     and one for the outdoor areas (garden, swimming pool etc.)
         *
         * Each map includes one or more areas - see the SupportedAreas attribute. In the context of this cluster
         * specification, a map is effectively a group label for a set of areas, rather than a graphical representation
         * that the clients can display to the users. The clients that present the list of available areas for user
         * selection (see the SelectAreas command) may choose to filter the SupportedAreas list based on the associated
         * map. For example, the clients may allow the user to indicate that the device is to operate on the first
         * floor, and allow the user to choose only from the areas situated on that level.
         *
         * If empty, that indicates that the device is currently unable to provide this information.
         *
         * Each entry in this list shall have a unique value for the MapID field.
         *
         * Each entry in this list shall have a unique value for the Name field.
         *
         * > [!NOTE]
         *
         * > due to the maximum size of this list and to the fact that the entries may include strings (see the Name
         *   field of the MapStruct data type), care must be taken by implementers to avoid creating a data structure
         *   that is overly large, which can result in significant latency in accessing this 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.
         *
         * When updating the SupportedMaps attribute list by deleting entries, or by setting the attribute to an empty
         * list, the SupportedAreas attribute shall be updated such that all entries in that list meet the constraints
         * indicated in the description of the SupportedAreas attribute. This may result in the server removing entries
         * from the SupportedAreas attribute list. See the SupportedAreas attribute description for the implications of
         * changing that attribute.
         *
         * The SupportedMaps attribute list changes mentioned above SHOULD NOT be allowed while the device is operating,
         * to reduce the impact on the clients, and the potential confusion for the users.
         *
         * @see {@link MatterSpecification.v142.Cluster} § 1.17.6.2
         */
        supportedMaps: Map[];
    }

    /**
     * {@link ServiceArea} supports these elements if it supports feature "ProgressReporting".
     */
    export interface ProgressReportingAttributes {
        /**
         * Indicates the operating status at one or more areas.
         *
         * Each entry in this list shall have a unique value for the AreaID field.
         *
         * For each entry in this list, the AreaID field shall match an entry on the SupportedAreas attribute’s list.
         *
         * When this attribute is empty, that represents that no progress information is currently available.
         *
         * If the SelectedAreas attribute is empty, indicating the device is not constrained to operate in any specific
         * areas, the Progress attribute list may change while the device operates, due to the device adding new entries
         * dynamically, when it determines which ones it can attempt to operate at.
         *
         * If the SelectedAreas attribute is not empty, and the device starts operating:
         *
         *   - the Progress attribute list shall be updated so each entry of SelectedAreas has a matching Progress list
         *     entry, based on the AreaID field
         *
         *   - the length of the Progress and SelectedAreas list shall be the same
         *
         *   - the entries in the Progress list shall be initialized by the server, by having their status set to
         *     Pending or Operating, and the TotalOperationalTime field set to null
         *
         * When the device ends operation unexpectedly, such as due to an error, the server shall update all Progress
         * list entries with the Status field set to Operating or Pending to Skipped.
         *
         * When the device finishes operating, successfully or not, it shall NOT change the Progress attribute, except
         * in the case of an unexpected end of operation as described above, or due to changes to the SupportedMaps or
         * SupportedAreas attributes, so the clients can retrieve the progress information at that time.
         *
         * > [!NOTE]
         *
         * > if the device implements the Operational Status cluster, or a derivation of it, in case the device fails to
         *   service any locations in the SelectedAreas list before ending the operation, it SHOULD use the Operational
         *   Status cluster to indicate that the device was unable to complete the operation (see the
         *   UnableToCompleteOperation error from that cluster specification). The clients SHOULD then read the Progress
         *   attribute, and indicate which areas have been successfully serviced (marked as completed).
         *
         * @see {@link MatterSpecification.v142.Cluster} § 1.17.6.6
         */
        progress: Progress[];
    }

    /**
     * Attributes that may appear in {@link ServiceArea}.
     *
     * Some properties may be optional if device support is not mandatory. Device support may also be affected by a
     * device's supported {@link Features}.
     */
    export interface Attributes {
        /**
         * This attribute shall contain the list of areas that can be included in the SelectedAreas attribute’s list.
         * Each item in this list represents a unique area, as indicated by the AreaID field of AreaStruct.
         *
         * Each entry in this list shall have a unique value for the AreaID field.
         *
         * If the SupportedMaps attribute is not empty, each entry in this list shall have a unique value for the
         * combination of the MapID and AreaInfo fields.
         *
         * If the SupportedMaps attribute is empty, each entry in this list shall have a unique value for the AreaInfo
         * field and shall have the MapID field set to null.
         *
         * An empty value indicates that the device is currently unable to provide the list of supported areas.
         *
         * > [!NOTE]
         *
         * > due to the maximum size of this list and to the fact that the entries may include strings (see
         *   LocationName), care must be taken by implementers to avoid creating a data structure that is overly large,
         *   which can result in significant latency in accessing this 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, or due to internal device changes.
         *
         * When removing entries in the SupportedAreas attribute list the server shall adjust the values of the
         * SelectedAreas, CurrentArea, and Progress attributes such that they only reference valid entries in the
         * updated SupportedAreas attribute list. These changes to the SelectedAreas, CurrentArea, and Progress
         * attributes may result in the server setting some or all of them to empty (for SelectedAreas and Progress) or
         * null (for CurrentArea), or updating them with data that matches the constraints from the description of the
         * respective attributes. These actions are required to ensure having a consistent representation of the maps
         * and locations available to the clients.
         *
         * The SupportedAreas attribute list changes mentioned above SHOULD NOT be allowed while the device is
         * operating, to reduce the impact on the clients, and the potential confusion for the users.
         *
         * A few examples are provided below.
         *
         * Valid list of areas:
         *
         *   - AreaID=0, LocationName="yellow bedroom", MapID=null
         *
         *   - AreaID=1, LocationName="orange bedroom", MapID=null
         *
         * Valid list of areas:
         *
         *   - AreaID=5, LocationName="hallway", MapID=1
         *
         *   - AreaID=3, LocationName="hallway", MapID=2
         *
         * @see {@link MatterSpecification.v142.Cluster} § 1.17.6.1
         */
        supportedAreas: Area[];

        /**
         * Indicates the set of areas where the device SHOULD attempt to operate.
         *
         * The mobile devices may travel without operating across any areas while attempting to reach the areas
         * indicated by the SelectedAreas attribute. For example, a robotic vacuum cleaner may drive without cleaning
         * when traveling without operating.
         *
         * If this attribute is empty, the device is not constrained to operate in any specific areas.
         *
         * If this attribute is not empty:
         *
         *   - each item in this list shall match the AreaID field of an entry in the SupportedAreas attribute’s list
         *
         *   - each entry in this list shall have a unique value
         *
         * @see {@link MatterSpecification.v142.Cluster} § 1.17.6.3
         */
        selectedAreas: number[];

        /**
         * If the device is mobile, this attribute shall indicate the area where the device is currently located,
         * regardless of whether it is operating or not, such as while traveling between areas.
         *
         * If the device is not mobile and can operate at multiple areas sequentially, this attribute shall indicate the
         * area which is currently being serviced, or the area which is currently traversed by the device. For example,
         * a camera device may use this attribute to indicate which area it currently takes video of (serviced area) or
         * which area it currently has in view but not taking video of (e.g. an area which is traversed while panning).
         *
         * > [!NOTE]
         *
         * > A device may traverse an area regardless of the status of the area (pending, skipped, or completed).
         *
         * If a device can simultaneously operate at multiple areas, such as in the case of a sensor that can monitor
         * multiple areas at the same time, the CurrentArea attribute shall NOT be implemented, since it doesn’t apply.
         * Else this attribute shall be optionally implemented.
         *
         * A null value indicates that the device is currently unable to provide this information. For example, the
         * device is traversing an unknown area, or the SupportedAreas attribute was updated and the area where the
         * device is located was removed from that list.
         *
         * If not null, the value of this attribute shall match the AreaID field of an entry on the SupportedAreas
         * attribute’s list.
         *
         * @see {@link MatterSpecification.v142.Cluster} § 1.17.6.4
         */
        currentArea: number | null;

        /**
         * Indicates the estimated Epoch time for completing operating at the area indicated by the CurrentArea
         * attribute, in seconds.
         *
         * A value of 0 means that the operation has completed.
         *
         * When this attribute is null, that represents that there is no time currently defined until operation
         * completion. This may happen, for example, because no operation is in progress or because the completion time
         * is unknown.
         *
         * Null if the CurrentArea attribute is null.
         *
         * If the Progress attribute is available, and it contains an entry matching CurrentArea, the server may use the
         * time estimate provided in the EstimatedTime field of that entry to compute the EstimatedEndTime attribute.
         *
         * The value of this attribute shall only be reported in the following cases:
         *
         *   - when it changes to or from 0
         *
         *   - when it decreases
         *
         *   - when it changes to or from null
         *
         *     > [!NOTE]
         *
         *     > If the device is capable of pausing its operation, this attribute may be set to null, to indicate that
         *       completion time is unknown, or increment the value while being in the paused state.
         *
         * @see {@link MatterSpecification.v142.Cluster} § 1.17.6.5
         */
        estimatedEndTime: number | null;

        /**
         * This attribute shall contain the list of supported maps.
         *
         * A map is a full or a partial representation of a home, known to the device. For example:
         *
         *   - a single level home may be represented using a single map
         *
         *   - a two level home may be represented using two maps, one for each level
         *
         *   - a single level home may be represented using two maps, each including a different set of rooms, such as
         *     "map of living room and kitchen" and "map of bedrooms and hallway"
         *
         *   - a single level home may be represented using one map for the indoor areas (living room, bedrooms etc.)
         *     and one for the outdoor areas (garden, swimming pool etc.)
         *
         * Each map includes one or more areas - see the SupportedAreas attribute. In the context of this cluster
         * specification, a map is effectively a group label for a set of areas, rather than a graphical representation
         * that the clients can display to the users. The clients that present the list of available areas for user
         * selection (see the SelectAreas command) may choose to filter the SupportedAreas list based on the associated
         * map. For example, the clients may allow the user to indicate that the device is to operate on the first
         * floor, and allow the user to choose only from the areas situated on that level.
         *
         * If empty, that indicates that the device is currently unable to provide this information.
         *
         * Each entry in this list shall have a unique value for the MapID field.
         *
         * Each entry in this list shall have a unique value for the Name field.
         *
         * > [!NOTE]
         *
         * > due to the maximum size of this list and to the fact that the entries may include strings (see the Name
         *   field of the MapStruct data type), care must be taken by implementers to avoid creating a data structure
         *   that is overly large, which can result in significant latency in accessing this 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.
         *
         * When updating the SupportedMaps attribute list by deleting entries, or by setting the attribute to an empty
         * list, the SupportedAreas attribute shall be updated such that all entries in that list meet the constraints
         * indicated in the description of the SupportedAreas attribute. This may result in the server removing entries
         * from the SupportedAreas attribute list. See the SupportedAreas attribute description for the implications of
         * changing that attribute.
         *
         * The SupportedMaps attribute list changes mentioned above SHOULD NOT be allowed while the device is operating,
         * to reduce the impact on the clients, and the potential confusion for the users.
         *
         * @see {@link MatterSpecification.v142.Cluster} § 1.17.6.2
         */
        supportedMaps: Map[];

        /**
         * Indicates the operating status at one or more areas.
         *
         * Each entry in this list shall have a unique value for the AreaID field.
         *
         * For each entry in this list, the AreaID field shall match an entry on the SupportedAreas attribute’s list.
         *
         * When this attribute is empty, that represents that no progress information is currently available.
         *
         * If the SelectedAreas attribute is empty, indicating the device is not constrained to operate in any specific
         * areas, the Progress attribute list may change while the device operates, due to the device adding new entries
         * dynamically, when it determines which ones it can attempt to operate at.
         *
         * If the SelectedAreas attribute is not empty, and the device starts operating:
         *
         *   - the Progress attribute list shall be updated so each entry of SelectedAreas has a matching Progress list
         *     entry, based on the AreaID field
         *
         *   - the length of the Progress and SelectedAreas list shall be the same
         *
         *   - the entries in the Progress list shall be initialized by the server, by having their status set to
         *     Pending or Operating, and the TotalOperationalTime field set to null
         *
         * When the device ends operation unexpectedly, such as due to an error, the server shall update all Progress
         * list entries with the Status field set to Operating or Pending to Skipped.
         *
         * When the device finishes operating, successfully or not, it shall NOT change the Progress attribute, except
         * in the case of an unexpected end of operation as described above, or due to changes to the SupportedMaps or
         * SupportedAreas attributes, so the clients can retrieve the progress information at that time.
         *
         * > [!NOTE]
         *
         * > if the device implements the Operational Status cluster, or a derivation of it, in case the device fails to
         *   service any locations in the SelectedAreas list before ending the operation, it SHOULD use the Operational
         *   Status cluster to indicate that the device was unable to complete the operation (see the
         *   UnableToCompleteOperation error from that cluster specification). The clients SHOULD then read the Progress
         *   attribute, and indicate which areas have been successfully serviced (marked as completed).
         *
         * @see {@link MatterSpecification.v142.Cluster} § 1.17.6.6
         */
        progress: Progress[];
    }

    /**
     * {@link ServiceArea} always supports these elements.
     */
    export interface BaseCommands {
        /**
         * This command is used to select a set of device areas, where the device is to operate.
         *
         * On receipt of this command the device shall respond with a SelectAreasResponse command.
         *
         * @see {@link MatterSpecification.v142.Cluster} § 1.17.7.1
         */
        selectAreas(request: SelectAreasRequest): MaybePromise<SelectAreasResponse>;

        /**
         * This command is used to skip the given area, and to attempt operating at other areas on the SupportedAreas
         * attribute list.
         *
         * On receipt of this command the device shall respond with a SkipAreaResponse command.
         *
         * @see {@link MatterSpecification.v142.Cluster} § 1.17.7.3
         */
        skipArea(request: SkipAreaRequest): MaybePromise<SkipAreaResponse>;
    }

    /**
     * Commands that may appear in {@link ServiceArea}.
     */
    export interface Commands extends BaseCommands {}

    export type Components = [
        { flags: {}, attributes: BaseAttributes, commands: BaseCommands },
        { flags: { maps: true }, attributes: MapsAttributes },
        { flags: { progressReporting: true }, attributes: ProgressReportingAttributes }
    ];
    export type Features = "SelectWhileRunning" | "ProgressReporting" | "Maps";

    /**
     * These are optional features supported by ServiceAreaCluster.
     *
     * @see {@link MatterSpecification.v142.Cluster} § 1.17.4
     */
    export enum Feature {
        /**
         * SelectWhileRunning (SELRUN)
         *
         * This feature indicates whether this device allows changing the selected areas, by using the SelectAreas
         * command, while operating.
         *
         * @see {@link MatterSpecification.v142.Cluster} § 1.17.4.1
         */
        SelectWhileRunning = "SelectWhileRunning",

        /**
         * ProgressReporting (PROG)
         *
         * The device implements the progress reporting feature
         */
        ProgressReporting = "ProgressReporting",

        /**
         * Maps (MAPS)
         *
         * The device has map support
         */
        Maps = "Maps"
    }

    /**
     * This is a struct representing an area known to the server.
     *
     * @see {@link MatterSpecification.v142.Cluster} § 1.17.5.4
     */
    export declare class Area {
        constructor(values?: Partial<Area>);

        /**
         * This field shall represent the identifier of the area.
         *
         * @see {@link MatterSpecification.v142.Cluster} § 1.17.5.4.1
         */
        areaId: number;

        /**
         * This field shall indicate the map identifier which the area is associated with. A value of null indicates
         * that the area is not associated with a map.
         *
         * If the SupportedMaps attribute is not empty, this field shall match the MapID field of an entry from the
         * SupportedMaps attribute’s list. If the SupportedMaps attribute is empty, this field shall be null.
         *
         * @see {@link MatterSpecification.v142.Cluster} § 1.17.5.4.2
         */
        mapId: number | null;

        /**
         * This field shall contain data describing the area.
         *
         * This SHOULD be used by clients to determine the name and/or the full, or the partial, semantics of a certain
         * area.
         *
         * > [!NOTE]
         *
         * > If any entries on the SupportedAreas attribute’s list have the AreaInfo field missing the semantic data,
         *   the client may remind the user to assign the respective data.
         *
         * @see {@link MatterSpecification.v142.Cluster} § 1.17.5.4.3
         */
        areaInfo: AreaInfo;
    };

    /**
     * This is a struct representing a map.
     *
     * @see {@link MatterSpecification.v142.Cluster} § 1.17.5.3
     */
    export declare class Map {
        constructor(values?: Partial<Map>);

        /**
         * This field shall represent the map’s identifier.
         *
         * @see {@link MatterSpecification.v142.Cluster} § 1.17.5.3.1
         */
        mapId: number;

        /**
         * This field shall represent a human understandable map description.
         *
         * For example: "Main Floor", or "Second Level".
         *
         * @see {@link MatterSpecification.v142.Cluster} § 1.17.5.3.2
         */
        name: string;
    };

    /**
     * This is a struct indicating the progress.
     *
     * @see {@link MatterSpecification.v142.Cluster} § 1.17.5.5
     */
    export declare class Progress {
        constructor(values?: Partial<Progress>);

        /**
         * This field shall indicate the identifier of the area, and the identifier shall be an entry in the
         * SupportedAreas attribute’s list.
         *
         * @see {@link MatterSpecification.v142.Cluster} § 1.17.5.5.1
         */
        areaId: number;

        /**
         * This field shall indicate the operational status of the device regarding the area indicated by the AreaID
         * field.
         *
         * @see {@link MatterSpecification.v142.Cluster} § 1.17.5.5.2
         */
        status: OperationalStatus;

        /**
         * This field shall indicate the total operational time, in seconds, from when the device started to operate at
         * the area indicated by the AreaID field, until the operation finished, due to completion or due to skipping,
         * including any time spent while paused.
         *
         * A value of null indicates that the total operational time is unknown.
         *
         * There may be cases where the total operational time exceeds the maximum value that can be conveyed by this
         * attribute, and in such instances this attribute shall be populated with null.
         *
         * Null if the Status field is not set to Completed or Skipped.
         *
         * @see {@link MatterSpecification.v142.Cluster} § 1.17.5.5.3
         */
        totalOperationalTime?: number | null;

        /**
         * This field shall indicate the estimated time for the operation, in seconds, from when the device will start
         * operating at the area indicated by the AreaID field, until the operation completes, excluding any time spent
         * while not operating in the area.
         *
         * A value of null indicates that the estimated time is unknown. If the estimated time is unknown, or if it
         * exceeds the maximum value that can be conveyed by this attribute, this attribute shall be null.
         *
         * After initializing the ProgressStruct instance, the server SHOULD NOT change the value of this field, except
         * when repopulating the entire instance, to avoid excessive reporting of the Progress attribute changes.
         *
         * @see {@link MatterSpecification.v142.Cluster} § 1.17.5.5.4
         */
        estimatedTime?: number | null;
    };

    /**
     * This command is used to select a set of device areas, where the device is to operate.
     *
     * On receipt of this command the device shall respond with a SelectAreasResponse command.
     *
     * @see {@link MatterSpecification.v142.Cluster} § 1.17.7.1
     */
    export declare class SelectAreasRequest {
        constructor(values?: Partial<SelectAreasRequest>);

        /**
         * This field indicates which areas the device is to operate at.
         *
         * If this field is empty, that indicates that the device is to operate without being constrained to any
         * specific areas, and the operation will not allow skipping using the SkipArea Command, otherwise the field
         * shall be a list of unique values that match the AreaID field of entries on the SupportedAreas list.
         *
         * @see {@link MatterSpecification.v142.Cluster} § 1.17.7.1.1
         */
        newAreas: number[];
    };

    /**
     * This command is sent by the device on receipt of the SelectAreas command.
     *
     * @see {@link MatterSpecification.v142.Cluster} § 1.17.7.2
     */
    export declare class SelectAreasResponse {
        constructor(values?: Partial<SelectAreasResponse>);

        /**
         * If the Status field is set to Success or UnsupportedArea, the server may use a non-empty string for the
         * StatusText field to provide additional information. For example, if Status is set to UnsupportedArea, the
         * server may use StatusText to indicate which areas are unsupported.
         *
         * If the Status field is not set to Success, or UnsupportedArea, the StatusText field shall include a
         * vendor-defined error description which can be used to explain the error to the user. For example, if the
         * Status field is set to InvalidInMode, the StatusText field SHOULD indicate why the request is not allowed,
         * given the current mode of the device, which may involve other clusters.
         *
         * @see {@link MatterSpecification.v142.Cluster} § 1.17.7.2.1
         */
        status: SelectAreasStatus;

        statusText: string;
    };

    /**
     * This command is used to skip the given area, and to attempt operating at other areas on the SupportedAreas
     * attribute list.
     *
     * On receipt of this command the device shall respond with a SkipAreaResponse command.
     *
     * @see {@link MatterSpecification.v142.Cluster} § 1.17.7.3
     */
    export declare class SkipAreaRequest {
        constructor(values?: Partial<SkipAreaRequest>);

        /**
         * The SkippedArea field indicates the area to be skipped.
         *
         * The SkippedArea field shall match an entry in the SupportedAreas list.
         *
         * @see {@link MatterSpecification.v142.Cluster} § 1.17.7.3.1
         */
        skippedArea: number;
    };

    /**
     * This command is sent by the device on receipt of the SkipArea command.
     *
     * @see {@link MatterSpecification.v142.Cluster} § 1.17.7.4
     */
    export declare class SkipAreaResponse {
        constructor(values?: Partial<SkipAreaResponse>);

        /**
         * If the Status field is set to Success or InvalidAreaList, the server may use a non-empty string for the
         * StatusText field to provide additional information. For example, if Status is set to InvalidAreaList, the
         * server may use StatusText to indicate why this list is invalid.
         *
         * If the Status field is not set to Success or InvalidAreaList, the StatusText field shall include a vendor
         * defined error description which can be used to explain the error to the user. For example, if the Status
         * field is set to InvalidInMode, the StatusText field SHOULD indicate why the request is not allowed, given the
         * current mode of the device, which may involve other clusters.
         *
         * @see {@link MatterSpecification.v142.Cluster} § 1.17.7.4.1
         */
        status: SkipAreaStatus;

        statusText: string;
    };

    /**
     * The data from this structure indicates a landmark and position relative to the landmark.
     *
     * @see {@link MatterSpecification.v142.Cluster} § 1.17.5.1
     */
    export declare class LandmarkInfo {
        constructor(values?: Partial<LandmarkInfo>);

        /**
         * This field shall indicate that the area is associated with a landmark.
         *
         * This field shall be the ID of a landmark semantic tag, located within the Common Landmark Namespace. For
         * example, this tag may indicate that the area refers to an area next to a table.
         *
         * @see {@link MatterSpecification.v142.Cluster} § 1.17.5.1.1
         */
        landmarkTag: number;

        /**
         * This field shall identify the position of the area relative to a landmark. This is a static description of a
         * zone known to the server, and this field never reflects the device’s own proximity or position relative to
         * the landmark, but that of the zone.
         *
         * This field shall be the ID of a relative position semantic tag, located within the Common Relative Position
         * Namespace.
         *
         * If the RelativePositionTag field is null, this field indicates proximity to the landmark. Otherwise, the
         * RelativePositionTag field indicates the position of the area relative to the landmark indicated by the
         * LandmarkTag field. For example, this tag, in conjunction with the LandmarkTag field, may indicate that the
         * area refers to a zone under a table.
         *
         * @see {@link MatterSpecification.v142.Cluster} § 1.17.5.1.2
         */
        relativePositionTag: number | null;
    };

    /**
     * The data from this structure indicates the name and/or semantic data describing an area, as detailed below.
     *
     * This data type includes the LocationInfo field, with the following fields: LocationName, FloorNumber, AreaType.
     * Additional semantic data may be available in the LandmarkInfo field.
     *
     * For an area description to be meaningful, it shall have at least one of the following:
     *
     *   - a non-empty name (LocationInfo’s LocationName field)
     *
     * OR
     *
     *   - some semantic data (one or more of these: FloorNumber, AreaType or LandmarkTag) The normative text from the
     *     remainder of this section describes these constraints.
     *
     * If the LocationInfo field is null, the LandmarkInfo field shall NOT be null.
     *
     * If the LandmarkInfo field is null, the LocationInfo field shall NOT be null.
     *
     * If LocationInfo is not null, and its LocationName field is an empty string, at least one of the following shall
     * NOT be null:
     *
     *   - LocationInfo’s FloorNumber field
     *
     *   - LocationInfo’s AreaType field
     *
     *   - LandmarkInfo field
     *
     * If all three of the following are null, LocationInfo’s LocationName field shall NOT be an empty string:
     *
     *   - LocationInfo’s FloorNumber field
     *
     *   - LocationInfo’s AreaType field
     *
     *   - LandmarkInfo field
     *
     * @see {@link MatterSpecification.v142.Cluster} § 1.17.5.2
     */
    export declare class AreaInfo {
        constructor(values?: Partial<AreaInfo>);

        /**
         * This field shall indicate the name of the area, floor number and/or area type.
         *
         * A few examples are provided below.
         *
         *   - An area can have LocationInfo’s LocationName field set to "blue room", and the AreaType field set to the
         *     ID of a "Living Room" semantic tag. Clients wishing to direct the device to operate in (or service) the
         *     living room can use this area.
         *
         *   - An area can have LocationInfo set to null, the LandmarkInfo’s LandmarkTag field set to the ID of the
         *     "Table" landmark semantic tag, and the RelativePositionTag field set to the ID of the "Under" position
         *     semantic tag. With such an area indication, the client can request the device to operate in (or service)
         *     the area located under the table.
         *
         * @see {@link MatterSpecification.v142.Cluster} § 1.17.5.2.1
         */
        locationInfo: Locationdesc | null;

        /**
         * This field shall indicate an association with a landmark. A value of null indicates that the information is
         * not available or known. For example, this may indicate that the area refers to a zone next to a table.
         *
         * If this field is not null, that indicates that the area is restricted to the zone where the landmark is
         * located, as indicated by the LandmarkTag and, if not null, by the RelativePositionTag fields, rather than to
         * the entire room or floor where the landmark is located, if those are indicated by the LocationInfo field.
         *
         * @see {@link MatterSpecification.v142.Cluster} § 1.17.5.2.2
         */
        landmarkInfo: LandmarkInfo | null;
    };

    /**
     * @see {@link MatterSpecification.v142.Cluster} § 1.17.5.6
     */
    export enum OperationalStatus {
        /**
         * The device has not yet started operating at the given area, or has not finished operating at that area but it
         * is not currently operating at the area
         */
        Pending = 0,

        /**
         * The device is currently operating at the given area
         */
        Operating = 1,

        /**
         * The device has skipped the given area, before or during operating at it, due to a SkipArea command, due an
         * out of band command (e.g. from the vendor’s application), due to a vendor specific reason, such as a time
         * limit used by the device, or due the device ending operating unsuccessfully
         */
        Skipped = 2,

        /**
         * The device has completed operating at the given area
         */
        Completed = 3
    }

    /**
     * @see {@link MatterSpecification.v142.Cluster} § 1.17.5.6.1
     */
    export enum SelectAreasStatus {
        /**
         * Attempting to operate in the areas identified by the entries of the NewAreas field is allowed and possible.
         * The SelectedAreas attribute is set to the value of the NewAreas field.
         */
        Success = 0,

        /**
         * The value of at least one of the entries of the NewAreas field doesn’t match any entries in the
         * SupportedAreas attribute.
         */
        UnsupportedArea = 1,

        /**
         * The received request cannot be handled due to the current mode of the device.
         */
        InvalidInMode = 2,

        /**
         * The set of values is invalid. For example, areas on different floors, that a robot knows it can’t reach on
         * its own.
         */
        InvalidSet = 3
    }

    /**
     * @see {@link MatterSpecification.v142.Cluster} § 1.17.5.6.2
     */
    export enum SkipAreaStatus {
        /**
         * Skipping the area is allowed and possible, or the device was operating at the last available area and has
         * stopped.
         */
        Success = 0,

        /**
         * The SelectedAreas attribute is empty.
         */
        InvalidAreaList = 1,

        /**
         * The received request cannot be handled due to the current mode of the device. For example, the CurrentArea
         * attribute is null or the device is not operating.
         */
        InvalidInMode = 2,

        /**
         * The SkippedArea field doesn’t match an entry in the SupportedAreas list.
         */
        InvalidSkippedArea = 3
    }

    /**
     * Attribute metadata objects keyed by name.
     */
    export const attributes: ClusterType.AttributeObjects<Attributes>;

    /**
     * Command metadata objects keyed by name.
     */
    export const commands: ClusterType.CommandObjects<Commands>;

    /**
     * Feature metadata objects keyed by name.
     */
    export const features: ClusterType.Features<Features>;

    /**
     * @deprecated Use {@link ServiceArea}.
     */
    export const Cluster: typeof ServiceArea;

    /**
     * @deprecated Use {@link ServiceArea}.
     */
    export const Complete: typeof ServiceArea;

    export const Typing: ServiceArea;
}

/**
 * @deprecated Use {@link ServiceArea}.
 */
export declare const ServiceAreaCluster: typeof ServiceArea;

export interface ServiceArea extends ClusterTyping {
    Attributes: ServiceArea.Attributes;
    Commands: ServiceArea.Commands;
    Features: ServiceArea.Features;
    Components: ServiceArea.Components;
}
