# Copyright (c) 2024 Project CHIP Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

name: 4.2.4. [TC-LVL-9.1] Scenes Management Cluster Interaction (DUT as Server)

PICS:
    - LVL.S
    - S.S

config:
    nodeId: 0x12344321
    cluster: "Scenes Management"
    endpoint: 1
    G1:
        type: group_id
        defaultValue: 0x0001

tests:
    - label: "Wait for the commissioned device to be retrieved"
      cluster: "DelayCommands"
      command: "WaitForCommissionee"
      arguments:
          values:
              - name: "nodeId"
                value: nodeId

    - label:
          "Step 0a :TH sends KeySetWrite command in the GroupKeyManagement
          cluster to DUT using a key that is pre-installed on the TH.
          GroupKeySet fields are as follows:"
      cluster: "Group Key Management"
      endpoint: 0
      command: "KeySetWrite"
      arguments:
          values:
              - name: "GroupKeySet"
                value:
                    {
                        GroupKeySetID: 0x01a1,
                        GroupKeySecurityPolicy: 0,
                        EpochKey0: "\xa0\xa1\xa2\xa3\xa4\xa5\xa6\xa7\xa8\xa9\xaa\xab\xac\xad\xae\xaf",
                        EpochStartTime0: 1110000,
                        EpochKey1: "\xb0\xb1\xb2\xb3\xb4\xb5\xb6\xb7\xb8\xb9\xba\xbb\xbc\xbd\xbe\xbf",
                        EpochStartTime1: 1110001,
                        EpochKey2: "\xc0\xc1\xc2\xc3\xc4\xc5\xc6\xc7\xc8\xc9\xca\xcb\xcc\xcd\xce\xcf",
                        EpochStartTime2: 1110002,
                    }

    - label:
          "Step 0b: TH binds GroupIds 0x0001 with GroupKeySetID 0x01a1 in the
          GroupKeyMap attribute list on GroupKeyManagement cluster by writing
          the GroupKeyMap attribute with two entries as follows:"
      cluster: "Group Key Management"
      endpoint: 0
      command: "writeAttribute"
      attribute: "GroupKeyMap"
      arguments:
          value: [{ FabricIndex: 1, GroupId: G1, GroupKeySetID: 0x01a1 }]

    - label: "Step 0c: TH sends a RemoveAllGroups command to DUT."
      cluster: "Groups"
      endpoint: endpoint
      command: "RemoveAllGroups"

    - label:
          "Step 1a: TH sends a AddGroup command to DUT with the GroupID field
          set to G1."
      cluster: "Groups"
      command: "AddGroup"
      arguments:
          values:
              - name: "GroupID"
                value: G1
              - name: "GroupName"
                value: "Group1"
      response:
          values:
              - name: "Status"
                value: 0
              - name: "GroupID"
                value: G1

    - label:
          "Step 1b: TH sends a RemoveAllScenes command to DUT with the GroupID
          field set to G1."
      command: "RemoveAllScenes"
      arguments:
          values:
              - name: "GroupID"
                value: G1
      response:
          values:
              - name: "Status"
                value: 0x00
              - name: "GroupID"
                value: G1
    - label:
          "Step 1c: TH sends a GetSceneMembership command to DUT with the
          GroupID field set to G1."
      command: "GetSceneMembership"
      arguments:
          values:
              - name: "GroupID"
                value: G1
      response:
          values:
              - name: "Status"
                value: 0x00
              - name: "GroupID"
                value: G1
              - name: "SceneList"
                value: []

    - label: "Step 2a: TH reads the MinLevel attribute from the DUT"
      cluster: "Level Control"
      command: "readAttribute"
      attribute: "MinLevel"
      response:
          saveAs: MinLevelValue
          constraints:
              type: int8u

    - label:
          "Step 2b: TH sends a MoveToLevel command to DUT, with Level =0 and
          TransitionTime =0 (immediate)"
      cluster: "Level Control"
      command: "MoveToLevel"
      arguments:
          values:
              - name: "Level"
                value: 0
              - name: "TransitionTime"
                value: 0
              - name: "OptionsMask"
                value: 1
              - name: "OptionsOverride"
                value: 1

    - label: "Step 2c: TH reads the CurrentLevel attribute from DUT"
      cluster: "Level Control"
      command: "readAttribute"
      attribute: "CurrentLevel"
      response:
          value: MinLevelValue

    - label:
          "Step 3: TH sends a StoreScene command to DUT with the GroupID field
          set to G1 and the SceneID field set to 0x01."
      command: "StoreScene"
      arguments:
          values:
              - name: "GroupID"
                value: G1
              - name: "SceneID"
                value: 0x01
      response:
          values:
              - name: "Status"
                value: 0x00
              - name: "GroupID"
                value: G1
              - name: "SceneID"
                value: 0x01

    - label: "Step 4: TH sends a AddScene command to DUT with the GroupID field
          set to G1, the SceneID field set to 0x02, the TransitionTime field set
          to 0 and the ExtensionFieldSets set to: '[{ ClusterID: 0x0008,
          AttributeValueList: [{ AttributeID: 0x0000, ValueUnsigned8: 0x64 }]}]'
          "
      command: "AddScene"
      arguments:
          values:
              - name: "GroupID"
                value: G1
              - name: "SceneID"
                value: 0x02
              - name: "TransitionTime"
                value: 0
              - name: "SceneName"
                value: "Scene1"
              - name: "ExtensionFieldSets"
                value:
                    [
                        {
                            ClusterID: 0x0008,
                            AttributeValueList:
                                [{ AttributeID: 0x0000, ValueUnsigned8: 0x64 }],
                        },
                    ]
      response:
          values:
              - name: "Status"
                value: 0x00
              - name: "GroupID"
                value: G1
              - name: "SceneID"
                value: 0x02

    - label:
          "Step 5a: TH sends a RecallScene command to DUT with the GroupID field
          set to G1 and the SceneID field set to 0x02."
      command: "RecallScene"
      arguments:
          values:
              - name: "GroupID"
                value: G1
              - name: "SceneID"
                value: 0x02

    - label: "Step 5b: TH reads the CurrentLevel attribute from DUT"
      cluster: "Level Control"
      command: "readAttribute"
      attribute: "CurrentLevel"
      response:
          value: 0x64

    - label:
          "Step 6a: TH sends a RecallScene command to DUT with the GroupID field
          set to G1 and the SceneID field set to 0x01."
      command: "RecallScene"
      arguments:
          values:
              - name: "GroupID"
                value: G1
              - name: "SceneID"
                value: 0x01

    - label: "Step 6b: TH reads the CurrentLevel attribute from DUT"
      cluster: "Level Control"
      command: "readAttribute"
      attribute: "CurrentLevel"
      response:
          value: MinLevelValue

    - label:
          "Cleanup: TH sends a RemoveAllScenes command to DUT with the GroupID
          field set to G1."
      command: "RemoveAllScenes"
      arguments:
          values:
              - name: "GroupID"
                value: G1
      response:
          values:
              - name: "Status"
                value: 0x00
              - name: "GroupID"
                value: G1

    - label: "Cleanup: TH sends a RemoveAllGroups command to DUT."
      cluster: "Groups"
      endpoint: endpoint
      command: "RemoveAllGroups"
