/**
 * @license
 * Copyright 2022-2025 Matter.js Authors
 * SPDX-License-Identifier: Apache-2.0
 */
import { MatterDefinition } from "../MatterDefinition.js";
import {
  ClusterElement as Cluster,
  AttributeElement as Attribute,
  CommandElement as Command,
  FieldElement as Field,
  DatatypeElement as Datatype
} from "../../elements/index.js";
const OtaSoftwareUpdateProvider = Cluster(
  {
    name: "OtaSoftwareUpdateProvider",
    id: 41,
    classification: "node",
    pics: "OTAP",
    xref: { document: "core", section: "11.20.6" }
  },
  Attribute({ name: "ClusterRevision", id: 65533, type: "ClusterRevision", default: 1 }),
  Command(
    {
      name: "QueryImage",
      id: 0,
      access: "O",
      conformance: "M",
      direction: "request",
      response: "QueryImageResponse",
      details: "Upon receipt, this command shall trigger an attempt to find an updated Software Image by the OTA Provider to match the OTA Requestor\u2019s constraints provided in the payload fields.",
      xref: { document: "core", section: "11.20.6.5.1" }
    },
    Field({
      name: "VendorId",
      id: 0,
      type: "vendor-id",
      conformance: "M",
      details: "The value shall be the Vendor ID applying to the OTA Requestor\u2019s Node and shall match the value reported by the Basic Information Cluster VendorID attribute.",
      xref: { document: "core", section: "11.20.6.5.1.1" }
    }),
    Field({
      name: "ProductId",
      id: 1,
      type: "uint16",
      conformance: "M",
      details: "The value shall be the Product ID applying to the OTA Requestor\u2019s Node and shall match the value reported by the Basic Information Cluster ProductID attribute.",
      xref: { document: "core", section: "11.20.6.5.1.2" }
    }),
    Field({
      name: "SoftwareVersion",
      id: 2,
      type: "uint32",
      conformance: "M",
      details: "The SoftwareVersion included in the request payload shall provide the value representing the current version running on the OTA Requestor invoking the command. This version shall be equal to the Software Version attribute of the Basic Information Cluster.",
      xref: { document: "core", section: "11.20.6.5.1.3" }
    }),
    Field(
      {
        name: "ProtocolsSupported",
        id: 3,
        type: "list",
        conformance: "M",
        constraint: "max 8",
        details: "This field shall contain a list of all download protocols supported by the OTA Requestor.\nThis field shall be used by the OTA Provider to generate the correct URI for the location of the Software Image when one is found to be available. The values of BDX Synchronous and BDX Asynchronous shall always be supported by an OTA Provider. Furthermore, OTA Providers with access to external networking SHOULD support the HTTPS protocol. OTA Providers may support other protocols.\nThe algorithm to select the specific protocol to use in a given Software Image URI is implementation-dependent, provided that the rules in Section 11.20.3.3.1, \u201CDownload Protocol selection\u201D are followed.\nSee Section 11.20.3.2, \u201CQuerying the OTA Provider\u201D and Section 11.20.3.5, \u201CTransfer of OTA Software Update images\u201D for more details about usage of this field.",
        xref: { document: "core", section: "11.20.6.5.1.4" }
      },
      Field({ name: "entry", type: "DownloadProtocolEnum" })
    ),
    Field({
      name: "HardwareVersion",
      id: 4,
      type: "uint16",
      conformance: "O",
      details: "The value of this field, if present, shall contain the OTA Requestor\u2019s hardware version, and shall be equal to the HardwareVersion attribute of the Basic Information Cluster.",
      xref: { document: "core", section: "11.20.6.5.1.5" }
    }),
    Field({
      name: "Location",
      id: 5,
      type: "string",
      conformance: "O",
      constraint: "2",
      details: "The location, if present, shall provide the same value as the Basic Information Cluster Location attribute for the OTA Requestor as configured. This may be used by the OTA Provider logic to allow per-region selection of the Software Image.",
      xref: { document: "core", section: "11.20.6.5.1.6" }
    }),
    Field({
      name: "RequestorCanConsent",
      id: 6,
      type: "bool",
      conformance: "O",
      default: false,
      details: "This field shall be set to true by an OTA Requestor that is capable of obtaining user consent for OTA application by virtue of built-in user interface capabilities. Otherwise, it shall be false.\nSee Section 11.20.3.4, \u201CObtaining user consent for updating software\u201D for application details about usage.",
      xref: { document: "core", section: "11.20.6.5.1.7" }
    }),
    Field({
      name: "MetadataForProvider",
      id: 7,
      type: "octstr",
      conformance: "O",
      constraint: "max 512",
      details: "This optional field, if present, shall consist of a top-level anonymous list; each list element shall have a profile-specific tag encoded in fully-qualified form. Each list element shall contain a manufacturer-specific payload, which the OTA Requestor invoking this command wants to expose to the receiving OTA Provider. This payload may be used for any purpose and SHOULD be as small as practical.\nThe use of this field SHOULD be restricted to Vendor-specific usage and shall NOT be used as a selector required to match for the selection of a Software Image in production environments, unless absolutely necessary, as the interpretation of this field may be ambiguous to OTA Providers implementing the Cluster in a compliant but divergent way from the sender.\nAn example of usage for this field is for an OTA Requestor to provide specific data about grouping or authentication in field trial environments, where the OTA Provider is likely to understand it and be able to act upon it, either for special selection of image, or recording of activity.\nAn OTA Provider shall report the availability of Software Images, if one is found to be applicable using the other provided fields, even if the MetadataForProvider field is deemed to contain invalid or unknown information. That is, the contents of the MetadataForProvider field shall NOT be used to deny a software update to an OTA Requestor, unless both OTA Requestor and OTA Provider have an externally agreed-upon policy whereby strictly correct additional MetadataForProvider is expected to fulfill the OTA Software Update process.\nUsage of the QueryImage Command\nOTA Requestors shall send a QueryImage command to the OTA Provider to determine the availability of a new Software Image.\nSee Section 11.20.3.2, \u201CQuerying the OTA Provider\u201D for full details about the OTA Software Update Query flow which makes use of this command.",
      xref: { document: "core", section: "11.20.6.5.1.8" }
    })
  ),
  Command(
    {
      name: "QueryImageResponse",
      id: 1,
      conformance: "M",
      direction: "response",
      xref: { document: "core", section: "11.20.6.5.2" }
    },
    Field({
      name: "Status",
      id: 0,
      type: "StatusEnum",
      conformance: "M",
      details: "This field shall contain the primary response regarding the availability of a Software Image.\nSee Section 11.20.3.2, \u201CQuerying the OTA Provider\u201D for details about the possible values for this field and their meaning.",
      xref: { document: "core", section: "11.20.6.5.2.1" }
    }),
    Field({
      name: "DelayedActionTime",
      id: 1,
      type: "uint32",
      conformance: "O",
      details: "This field shall convey the minimum time to wait, in seconds from the time of this response, before sending another QueryImage command or beginning a download from the OTA Provider. OTA Requestors shall respect this minimum delay, unless they had previously restarted and lost track of it. OTA Providers SHOULD expect OTA Requestors to follow this value to their best capability, however, a restarting Node may come back sooner, due to having lost track of this state response.\nThe DelayedActionTime field shall only be present if the Status field is set to Busy.\nSee Section 11.20.3.2, \u201CQuerying the OTA Provider\u201D for details about the rules regarding this field.",
      xref: { document: "core", section: "11.20.6.5.2.2" }
    }),
    Field(
      {
        name: "ImageUri",
        id: 2,
        type: "string",
        conformance: "O",
        constraint: "max 256",
        details: `This field, when present, shall contain a URI where the OTA Requestor SHOULD download a Software Image. The syntax of the ImageURI field shall follow the URI syntax as specified in RFC 3986.
This field shall be present if it appears in a QueryImageResponse with a Status of UpdateAvailable.
If the ImageURI specifies a BDX Protocol bdx: scheme, then the following rules describe the location to be used for download:
  1. The URI\u2019s scheme field shall be exactly bdx in lowercase characters.
  2. The URI\u2019s authority field shall contain only the host portion and shall use string      representation of the Operational Node ID of the Node where to proceed with the download, on      the same Fabric on which the OTA Requestor received the QueryImageResponse.
  3. The encoding of the Node ID in the host field shall use an uppercase hexadecimal format, using      exactly 16 characters to encode the network byte order value of the NodeID, in a similar      fashion as the Node Identifier portion of the Operational Instance Name.
    a. The Operational Node ID in the host field shall match the NodeID of the OTA Provider        responding with the QueryImageResponse. The usage of a different Node ID than that of the        provider is reserved for future use. This constraint reduces the number of independent
CASE secure channel sessions that have to be maintained to proceed with OTA software updates, thus reducing energy and resource utilization for the software update process.
4. The user section of the authority field shall be absent, as there are no "users" to be considered.
5. The port section of the authority field shall be absent, as the port for transport shall be determined through Operational Discovery of the target Node.
6. The URI shall not contain a query field.
7. The URI shall not contain a fragment field.
8. The path field shall employ absolute path representation and shall contain the file designator of the software image to download at the BDX server. When used with the BDX server, the leading / separating the URI authority from the path shall be omitted. When contacting the BDX server, further processing of the file designator shall NOT be done, including handling of URL-encoded escape sequences. Rather, the exact octets of the path, as received shall be the values used by both client and server in handling the file designator.
  a. The path shall only contain valid URI characters.
These rules above for BDX URIs simplify parsing for OTA Requestors receiving Image URIs. The following example procedure shows how the format constraints simplify the extraction of the necessary data to reach the BDX server for download.
  1. Verify that the URI is 24 characters or longer, which is the minimum length of a valid BDX URI      with all elements present, for example bdx://00112233AABBCCDD/0.
  2. Verify the presence of prefix bdx:// indicating a BDX URI.
  3. Extract the next 16 characters and convert from uppercase hexadecimal to a 64-bit scalar      value, considering network byte order. This is the destination Node ID.
  4. Verify the presence of a path separator / and skip it.
  5. Extract the remaining characters of the string as the file designator to employ when      initiating the BDX transfer.
Example ImageURI values are below, and illustrate some but not all of valid and invalid cases:
  \u2022 Synchronous or Asynchronous BDX Protocol:
    \u25E6 Valid: bdx://8899AABBCCDDEEFF/the_file_designator123
      \u25AA Node ID: 0x8899AABBCCDDEEFF
      \u25AA File designator: the_file_designator123
    \u25E6 Valid: bdx://0099AABBCCDDEE77/the%20file%20designator/some_more
      \u25AA Node ID: 0x0099AABBCCDDEE77
      \u25AA File designator: the%20file%20designator/some_more. Note that the %20 are retained and not         converted to ASCII 0x20 (space). The file designator is the path as received verbatim,         after the first '/' (U+002F / SOLIDUS) following the host.
    \u25E6 Invalid: bdx://99AABBCCDDEE77/the_file_designator123
      \u25AA Node ID: Invalid since it is not exactly 16 characters long, due to having omitted leading         zeros.
    \u25E6 Invalid: bdx://0099aabbccddee77/the_file_designator123
      \u25AA Node ID: Invalid since lowercase hexadecimal was used.
    \u25E6 Invalid: bdx:8899AABBCCDDEEFF/the_file_designator123
      \u25AA Invalid since bdx scheme does not contain an authority, that is, it does not have // after         the first :.
  \u2022 HTTP over TLS:
    \u25E6 Valid: https://example.domain:8466/software/image.bin
See Section 11.20.3.2, \u201CQuerying the OTA Provider\u201D for additional details about the flow.`,
        xref: { document: "core", section: "11.20.6.5.2.3" }
      }
    ),
    Field({
      name: "SoftwareVersion",
      id: 3,
      type: "uint32",
      conformance: "O",
      details: "This field indicates the version of the image being provided to the OTA Requestor by the OTA Provider when the Status is UpdateAvailable.\nThis field shall be present if it appears in a QueryImageResponse with a Status of UpdateAvailable.\nSee Section 11.20.3.2, \u201CQuerying the OTA Provider\u201D for additional details about the flow and acceptable values.",
      xref: { document: "core", section: "11.20.6.5.2.4" }
    }),
    Field({
      name: "SoftwareVersionString",
      id: 4,
      type: "string",
      conformance: "O",
      constraint: "1 to 64",
      details: "This field provides a string version of the image being provided to the OTA Requestor by the OTA Provider when the Status is UpdateAvailable.\nThis field shall be present if it appears in a QueryImageResponse with a Status of UpdateAvailable.\nSee Section 11.20.3.2, \u201CQuerying the OTA Provider\u201D for additional details about the flow and acceptable values.",
      xref: { document: "core", section: "11.20.6.5.2.5" }
    }),
    Field({
      name: "UpdateToken",
      id: 5,
      type: "octstr",
      conformance: "O",
      constraint: "8 to 32",
      details: "This optional field shall be present when the Status field contains UpdateAvailable.\nSee Section 11.20.3.6.1, \u201CUpdateToken usage\u201D for additional details about the generation and usage of UpdateToken.",
      xref: { document: "core", section: "11.20.6.5.2.6" }
    }),
    Field({
      name: "UserConsentNeeded",
      id: 6,
      type: "bool",
      conformance: "O",
      default: false,
      details: "This field, if present, shall only be interpreted if the OTA Requestor had previously indicated a value of True in the RequestorCanConsent field of the QueryImageRequest. This field, when present and set to True, shall indicate that a capable OTA Requestor must obtain user-visible consent prior to downloading the OTA Software Image.\nSee Section 11.20.3.4, \u201CObtaining user consent for updating software\u201D for application details about usage.",
      xref: { document: "core", section: "11.20.6.5.2.7" }
    }),
    Field({
      name: "MetadataForRequestor",
      id: 7,
      type: "octstr",
      conformance: "O",
      constraint: "max 512",
      details: "This optional field, if present, shall consist of a top-level anonymous list; each list element shall have a profile-specific tag encoded in fully-qualified form. Each list element shall contain a manufacturer-specific payload, which the OTA Provider wants to expose to the receiving OTA Requestor. This payload may be used for any purpose and SHOULD be as small as practical.\nThe presence of this field shall NOT be required for correct operation of any OTA Provider compliant with this Cluster specification.\nThe data for this field does not exist in any Distributed Compliance Ledger record and SHOULD only be emitted by an OTA Provider with this additional knowledge if it has knowledge that the receiving OTA Requestor may be able to use it.",
      xref: { document: "core", section: "11.20.6.5.2.8" }
    })
  ),
  Command(
    {
      name: "ApplyUpdateRequest",
      id: 2,
      access: "O",
      conformance: "M",
      direction: "request",
      response: "ApplyUpdateResponse",
      xref: { document: "core", section: "11.20.6.5.3" }
    },
    Field({
      name: "UpdateToken",
      id: 0,
      type: "octstr",
      conformance: "M",
      constraint: "8 to 32",
      details: "This field shall contain the UpdateToken as specified in Section 11.20.3.6.1, \u201CUpdateToken usage\u201D. This field may be used by the OTA Provider to track minimal lifecycle state to allow finer-grained scheduling of the application of Software Images by OTA Requestors.",
      xref: { document: "core", section: "11.20.6.5.3.1" }
    }),
    Field({
      name: "NewVersion",
      id: 1,
      type: "uint32",
      conformance: "M",
      details: "The NewVersion field included in the request payload shall provide the SoftwareVersion value of the new Software Image which the OTA Requestor is ready to start applying. The OTA Provider may use this new version to track or record Software Image application by OTA Requestors.\nWhen Generated\nThe ApplyUpdateRequest Command shall be invoked by an OTA Requestor once it is ready to apply a previously downloaded Software Image.\nEffect on Receipt\nUpon receipt of this command the OTA Provider shall respond with an Action field consistent with the next action the OTA Requestor should take, including any possible time delay.\nThe OTA Provider shall NOT refer to previously stored state about any download progress to reply. If any state keeping is done by the OTA Provider, it shall only relate to the UpdateToken and the history of prior ApplyUpdateRequest commands.\nSee Section 11.20.3.6, \u201CApplying a software update\u201D for a description of the flow in response to an OTA Provider receiving an invocation of this command.\nHandling Error Cases\nSee Section 11.20.3.6, \u201CApplying a software update\u201D for all error-handling information.",
      xref: { document: "core", section: "11.20.6.5.3.2" }
    })
  ),
  Command(
    {
      name: "ApplyUpdateResponse",
      id: 3,
      conformance: "M",
      direction: "response",
      xref: { document: "core", section: "11.20.6.5.4" }
    },
    Field({
      name: "Action",
      id: 0,
      type: "ApplyUpdateActionEnum",
      conformance: "M",
      details: "The Action field shall express the action that the OTA Provider requests from the OTA Requestor. See Section 11.20.3.6, \u201CApplying a software update\u201D for a description of the Action values provided in response to an OTA Provider receiving an invocation of this command.",
      xref: { document: "core", section: "11.20.6.5.4.1" }
    }),
    Field({
      name: "DelayedActionTime",
      id: 1,
      type: "uint32",
      conformance: "M",
      details: "The minimum time period the OTA Requestor shall wait before executing the Action, in seconds from receipt.\nIf this field has a value higher than 86400 seconds (24 hours), then the OTA Requestor may assume a value of 86400, in order to reduce undue Software Image application delays.",
      xref: { document: "core", section: "11.20.6.5.4.2" }
    })
  ),
  Command(
    {
      name: "NotifyUpdateApplied",
      id: 4,
      access: "O",
      conformance: "M",
      direction: "request",
      response: "status",
      xref: { document: "core", section: "11.20.6.5.5" }
    },
    Field({
      name: "UpdateToken",
      id: 0,
      type: "octstr",
      conformance: "M",
      constraint: "8 to 32",
      details: "This field shall contain the UpdateToken as specified in Section 11.20.3.6.1, \u201CUpdateToken usage\u201D.",
      xref: { document: "core", section: "11.20.6.5.5.1" }
    }),
    Field({
      name: "SoftwareVersion",
      id: 1,
      type: "uint32",
      conformance: "M",
      details: "The SoftwareVersion included in the request payload shall provide the same value as the SoftwareVersion attribute in the invoking OTA Requestor\u2019s Basic Information Cluster, and SHOULD be consistent with the value representing a new version running on the Node invoking the command.\nWhen Generated\nThe NotifyUpdateApplied command SHOULD be invoked in the following two circumstances:\n  1. An OTA Requestor has just successfully applied a Software Image it had obtained from a      previous QueryImage response.\n  2. An OTA Requestor has just successfully applied a Software Image it had obtained through means      different than those of this Cluster.\nAn OTA Provider may use the state of invocation of this command to help track the progress of update for OTA Requestors it knows require a new OTA Software Image. However, due to the possibility that an OTA Requestor may never come back (e.g. device removed from Fabric altogether, or a critical malfunction), an OTA Provider shall NOT expect every OTA Requestor to invoke this command for correct operation of the OTA Provider.\nThis command shall be considered optional and shall not result in reduced availability of the OTA Provider functionality if OTA Requestors never invoke this command.\nEffect on Receipt\nAn OTA Provider receiving an invocation of this command may log it internally.\nOn receiving this command, an OTA Provider may use the information to update its bookkeeping of cached Software Images, or use it for other similar administrative purposes.",
      xref: { document: "core", section: "11.20.6.5.5.2" }
    })
  ),
  Datatype(
    {
      name: "StatusEnum",
      type: "enum8",
      details: "See Section 11.20.3.2, \u201CQuerying the OTA Provider\u201D for the semantics of these values.",
      xref: { document: "core", section: "11.20.6.4.1" }
    },
    Field({
      name: "UpdateAvailable",
      id: 0,
      conformance: "M",
      description: "Indicates that the OTA Provider has an update available."
    }),
    Field({
      name: "Busy",
      id: 1,
      conformance: "M",
      description: "Indicates OTA Provider may have an update, but it is not ready yet."
    }),
    Field({
      name: "NotAvailable",
      id: 2,
      conformance: "M",
      description: "Indicates that there is definitely no update currently available from the OTA Provider."
    }),
    Field({
      name: "DownloadProtocolNotSupported",
      id: 3,
      conformance: "M",
      description: "Indicates that the requested download protocol is not supported by the OTA Provider."
    })
  ),
  Datatype(
    {
      name: "ApplyUpdateActionEnum",
      type: "enum8",
      details: "See Section 11.20.3.6, \u201CApplying a software update\u201D for the semantics of the values. This enumeration is used in the Action field of the ApplyUpdateResponse command. See (Section 11.20.6.5.4.1, \u201CAction Field\u201D).",
      xref: { document: "core", section: "11.20.6.4.2" }
    },
    Field({ name: "Proceed", id: 0, conformance: "M", description: "Apply the update." }),
    Field({ name: "AwaitNextAction", id: 1, conformance: "M", description: "Wait at least the given delay time." }),
    Field({
      name: "Discontinue",
      id: 2,
      conformance: "M",
      description: "The OTA Provider is conveying a desire to rescind a previously provided Software Image."
    })
  ),
  Datatype(
    {
      name: "DownloadProtocolEnum",
      type: "enum8",
      details: "Note that only HTTP over TLS (HTTPS) is supported (see RFC 7230). Using HTTP without TLS shall\nNOT be supported, as there is no way to authenticate the involved participants.",
      xref: { document: "core", section: "11.20.6.4.3" }
    },
    Field({ name: "BdxSynchronous", id: 0, conformance: "M", description: "Indicates support for synchronous BDX." }),
    Field({ name: "BdxAsynchronous", id: 1, conformance: "O", description: "Indicates support for asynchronous BDX." }),
    Field({ name: "Https", id: 2, conformance: "O", description: "Indicates support for HTTPS." }),
    Field({
      name: "VendorSpecific",
      id: 3,
      conformance: "O",
      description: "Indicates support for vendor specific protocol."
    })
  )
);
MatterDefinition.children.push(OtaSoftwareUpdateProvider);
export {
  OtaSoftwareUpdateProvider
};
//# sourceMappingURL=OtaSoftwareUpdateProvider.js.map
