Fix various ZAP templates to handle name collisions between global and cluster-specific structs better. (#38621)

Will also need https://github.com/project-chip/zap/pull/1584 to actually
generate the right things.
diff --git a/examples/darwin-framework-tool/templates/commands.zapt b/examples/darwin-framework-tool/templates/commands.zapt
index 3b80f65..5234d26 100644
--- a/examples/darwin-framework-tool/templates/commands.zapt
+++ b/examples/darwin-framework-tool/templates/commands.zapt
@@ -161,14 +161,14 @@
 
         dispatch_queue_t callbackQueue = dispatch_queue_create("com.chip.command", DISPATCH_QUEUE_SERIAL_WITH_AUTORELEASE_POOL);
         __auto_type * cluster = [[MTRBase{{>cluster}} alloc] initWithDevice:device endpointID:@(endpointId) queue:callbackQueue];
-        {{#if_is_fabric_scoped_struct type}}
+        {{#if_is_fabric_scoped_struct type cluster=../name}}
         __auto_type * params = [[MTRReadParams alloc] init];
         if (mFabricFiltered.HasValue()) {
           params.filterByFabric = mFabricFiltered.Value();
         }
         {{/if_is_fabric_scoped_struct}}
         [cluster read{{>attribute}}With
-        {{~#if_is_fabric_scoped_struct type~}}
+        {{~#if_is_fabric_scoped_struct type cluster=../name~}}
         Params:params completion:
         {{~else~}}
         Completion:
diff --git a/src/app/zap-templates/partials/cluster-objects-struct.zapt b/src/app/zap-templates/partials/cluster-objects-struct.zapt
index 0b081b4..c17d2bc 100644
--- a/src/app/zap-templates/partials/cluster-objects-struct.zapt
+++ b/src/app/zap-templates/partials/cluster-objects-struct.zapt
@@ -9,7 +9,7 @@
     struct Type {
     public:
         {{#zcl_struct_items}}
-        {{zapTypeToEncodableClusterObjectType type}} {{asLowerCamelCase label}}{{> cluster_objects_field_init}};
+        {{zapTypeToEncodableClusterObjectType type cluster=../cluster}} {{asLowerCamelCase label}}{{> cluster_objects_field_init}};
         {{/zcl_struct_items}}
 
         {{#unless struct_contains_array}}
@@ -41,7 +41,7 @@
     struct DecodableType {
     public:
         {{#zcl_struct_items}}
-        {{zapTypeToDecodableClusterObjectType type}} {{asLowerCamelCase label}}{{> cluster_objects_field_init}};
+        {{zapTypeToDecodableClusterObjectType type cluster=../cluster}} {{asLowerCamelCase label}}{{> cluster_objects_field_init}};
         {{/zcl_struct_items}}
 
         CHIP_ERROR Decode(TLV::TLVReader &reader);
diff --git a/src/app/zap-templates/templates/app/cluster-commands-header.zapt b/src/app/zap-templates/templates/app/cluster-commands-header.zapt
index cca5603..063fe8a 100644
--- a/src/app/zap-templates/templates/app/cluster-commands-header.zapt
+++ b/src/app/zap-templates/templates/app/cluster-commands-header.zapt
@@ -59,7 +59,7 @@
     static constexpr ClusterId GetClusterId() { return Clusters::{{asUpperCamelCase parent.name}}::Id; }
 
     {{#zcl_command_arguments}}
-    {{zapTypeToEncodableClusterObjectType type}} {{asLowerCamelCase label}}{{> cluster_objects_field_init}};
+    {{zapTypeToEncodableClusterObjectType type cluster=../../name}} {{asLowerCamelCase label}}{{> cluster_objects_field_init}};
     {{/zcl_command_arguments}}
 
     CHIP_ERROR Encode(TLV::TLVWriter & aWriter, TLV::Tag aTag) const;
@@ -80,7 +80,7 @@
     static constexpr ClusterId GetClusterId() { return Clusters::{{asUpperCamelCase parent.name}}::Id; }
 
     {{#zcl_command_arguments}}
-    {{zapTypeToDecodableClusterObjectType type}} {{asLowerCamelCase label}}{{> cluster_objects_field_init}};
+    {{zapTypeToDecodableClusterObjectType type cluster=../../name}} {{asLowerCamelCase label}}{{> cluster_objects_field_init}};
     {{/zcl_command_arguments}}
     CHIP_ERROR Decode(TLV::TLVReader &reader);
 };
diff --git a/src/app/zap-templates/templates/app/cluster-events-header.zapt b/src/app/zap-templates/templates/app/cluster-events-header.zapt
index f5348c5..0d7001b 100644
--- a/src/app/zap-templates/templates/app/cluster-events-header.zapt
+++ b/src/app/zap-templates/templates/app/cluster-events-header.zapt
@@ -43,7 +43,7 @@
     static constexpr bool kIsFabricScoped = {{isFabricSensitive}};
 
     {{#zcl_event_fields}}
-    {{zapTypeToEncodableClusterObjectType type}} {{asLowerCamelCase name}}{{> cluster_objects_field_init}};
+    {{zapTypeToEncodableClusterObjectType type cluster=../../name}} {{asLowerCamelCase name}}{{> cluster_objects_field_init}};
     {{/zcl_event_fields}}
 
     {{#if isFabricSensitive}}
@@ -62,7 +62,7 @@
     static constexpr ClusterId GetClusterId() { return Clusters::{{asUpperCamelCase parent.name}}::Id; }
 
     {{#zcl_event_fields}}
-    {{zapTypeToDecodableClusterObjectType type}} {{asLowerCamelCase name}}{{> cluster_objects_field_init}};
+    {{zapTypeToDecodableClusterObjectType type cluster=../../name}} {{asLowerCamelCase name}}{{> cluster_objects_field_init}};
     {{/zcl_event_fields}}
 
     CHIP_ERROR Decode(TLV::TLVReader &reader);
diff --git a/src/app/zap-templates/templates/app/cluster-events-src.zapt b/src/app/zap-templates/templates/app/cluster-events-src.zapt
index 4843b84..ccabf23 100644
--- a/src/app/zap-templates/templates/app/cluster-events-src.zapt
+++ b/src/app/zap-templates/templates/app/cluster-events-src.zapt
@@ -17,7 +17,7 @@
     TLV::TLVType outer;
     ReturnErrorOnFailure(aWriter.StartContainer(aTag, TLV::kTLVType_Structure, outer));
     {{#zcl_event_fields}}
-    {{#if_is_fabric_scoped_struct type}}
+    {{#if_is_fabric_scoped_struct type cluster=../../name}}
     ReturnErrorOnFailure(DataModel::EncodeForRead(aWriter, TLV::ContextTag(Fields::k{{asUpperCamelCase name}}), GetFabricIndex(), {{asLowerCamelCase name}}));
     {{else}}
     ReturnErrorOnFailure(DataModel::Encode(aWriter, TLV::ContextTag(Fields::k{{asUpperCamelCase name}}), {{asLowerCamelCase name}}));
diff --git a/src/app/zap-templates/templates/app/cluster-structs-header.zapt b/src/app/zap-templates/templates/app/cluster-structs-header.zapt
index 18788b6..a0c01cd 100644
--- a/src/app/zap-templates/templates/app/cluster-structs-header.zapt
+++ b/src/app/zap-templates/templates/app/cluster-structs-header.zapt
@@ -22,7 +22,7 @@
 {{#if has_more_than_one_cluster}}
 namespace {{asUpperCamelCase name}} = Clusters::detail::Structs::{{asUpperCamelCase name}};
 {{else}}
-{{> cluster_objects_struct header=true}}
+{{> cluster_objects_struct cluster=../name header=true}}
 {{/if}}
 {{/zcl_structs}}
 } // namespace Structs
diff --git a/src/app/zap-templates/templates/app/cluster-structs-src.zapt b/src/app/zap-templates/templates/app/cluster-structs-src.zapt
index 1f67f95..537d70f 100644
--- a/src/app/zap-templates/templates/app/cluster-structs-src.zapt
+++ b/src/app/zap-templates/templates/app/cluster-structs-src.zapt
@@ -11,7 +11,7 @@
 namespace Structs {
 {{#zcl_structs}}
 {{#unless has_more_than_one_cluster}}
-{{> cluster_objects_struct header=false}}
+{{> cluster_objects_struct cluster=../name header=false}}
 {{/unless}}
 {{/zcl_structs}}
 } // namespace Structs
diff --git a/src/app/zap-templates/templates/app/shared-cluster-structs-src.zapt b/src/app/zap-templates/templates/app/shared-cluster-structs-src.zapt
index b3a34cd..57335c0 100644
--- a/src/app/zap-templates/templates/app/shared-cluster-structs-src.zapt
+++ b/src/app/zap-templates/templates/app/shared-cluster-structs-src.zapt
@@ -13,7 +13,7 @@
 namespace Structs {
 {{#zcl_structs}}
 {{#if has_more_than_one_cluster}}
-{{> cluster_objects_struct header=false}}
+{{> cluster_objects_struct cluster="" header=false}}
 {{/if}}
 {{/zcl_structs}}
 } // namespace Structs
diff --git a/src/app/zap-templates/templates/app/shared-cluster-structs.zapt b/src/app/zap-templates/templates/app/shared-cluster-structs.zapt
index 80be39d..7190564 100644
--- a/src/app/zap-templates/templates/app/shared-cluster-structs.zapt
+++ b/src/app/zap-templates/templates/app/shared-cluster-structs.zapt
@@ -24,7 +24,7 @@
 
 {{#zcl_structs}}
 {{#if has_more_than_one_cluster}}
-{{> cluster_objects_struct header=true}}
+{{> cluster_objects_struct  cluster="" header=true}}
 {{/if}}
 {{/zcl_structs}}
 } // namespace Structs
diff --git a/src/controller/python/templates/partials/struct_def.zapt b/src/controller/python/templates/partials/struct_def.zapt
index 86e643b..43fec8f 100644
--- a/src/controller/python/templates/partials/struct_def.zapt
+++ b/src/controller/python/templates/partials/struct_def.zapt
@@ -1,4 +1,4 @@
-{{! Takes cluster (possibly "Globals") as argument, already upper-camel-cased. }}
+{{! Takes cluster name (possibly "Globals") as argument, exactly as it looks in the XML. }}
         @dataclass
         class {{asUpperCamelCase name}}(ClusterObject):
             @ChipUtility.classproperty
@@ -6,10 +6,10 @@
                 return ClusterObjectDescriptor(
                     Fields=[
                     {{#zcl_struct_items}}
-                        ClusterObjectFieldDescriptor(Label="{{ asLowerCamelCase label }}", Tag={{ fieldIdentifier }}, Type={{zapTypeToPythonClusterObjectType type ns=../cluster}}),
+                        ClusterObjectFieldDescriptor(Label="{{ asLowerCamelCase label }}", Tag={{ fieldIdentifier }}, Type={{zapTypeToPythonClusterObjectType type ns=(asUpperCamelCase ../cluster) cluster=../cluster}}),
                     {{/zcl_struct_items}}
                     ])
 
             {{#zcl_struct_items}}
-            {{ asLowerCamelCase label }}: '{{zapTypeToPythonClusterObjectType type ns=../cluster}}' = {{getPythonFieldDefault type ns=../cluster}}
+            {{ asLowerCamelCase label }}: '{{zapTypeToPythonClusterObjectType type ns=(asUpperCamelCase ../cluster) cluster=../cluster}}' = {{getPythonFieldDefault type ns=(asUpperCamelCase ../cluster) cluster=../cluster}}
             {{/zcl_struct_items}}
diff --git a/src/controller/python/templates/python-cluster-Objects-py.zapt b/src/controller/python/templates/python-cluster-Objects-py.zapt
index ed3b189..fac7417 100644
--- a/src/controller/python/templates/python-cluster-Objects-py.zapt
+++ b/src/controller/python/templates/python-cluster-Objects-py.zapt
@@ -66,18 +66,18 @@
             Fields=[
 {{#zcl_attributes_server}}
             {{#if entryType}}
-                ClusterObjectFieldDescriptor(Label="{{ asLowerCamelCase label }}", Tag={{asMEI manufacturerCode code}}, Type={{zapTypeToPythonClusterObjectType entryType ns=(asUpperCamelCase parent.name)}}),
+                ClusterObjectFieldDescriptor(Label="{{ asLowerCamelCase label }}", Tag={{asMEI manufacturerCode code}}, Type={{zapTypeToPythonClusterObjectType entryType ns=(asUpperCamelCase parent.name) cluster=parent.name}}),
             {{else}}
-                ClusterObjectFieldDescriptor(Label="{{ asLowerCamelCase label }}", Tag={{asMEI manufacturerCode code}}, Type={{zapTypeToPythonClusterObjectType type ns=(asUpperCamelCase parent.name)}}),
+                ClusterObjectFieldDescriptor(Label="{{ asLowerCamelCase label }}", Tag={{asMEI manufacturerCode code}}, Type={{zapTypeToPythonClusterObjectType type ns=(asUpperCamelCase parent.name) cluster=parent.name}}),
             {{/if}}
 {{/zcl_attributes_server}}
             ])
 
 {{#zcl_attributes_server}}
 {{#if entryType}}
-    {{ asLowerCamelCase label }}: {{zapTypeToPythonClusterObjectType entryType ns=(asUpperCamelCase parent.name)}} = {{getPythonFieldDefault entryType ns=(asUpperCamelCase parent.name)}}
+    {{ asLowerCamelCase label }}: {{zapTypeToPythonClusterObjectType entryType ns=(asUpperCamelCase parent.name) cluster=parent.name}} = {{getPythonFieldDefault entryType ns=(asUpperCamelCase parent.name) cluster=parent.name}}
 {{else}}
-    {{ asLowerCamelCase label }}: {{zapTypeToPythonClusterObjectType type ns=(asUpperCamelCase parent.name)}} = {{getPythonFieldDefault type ns=(asUpperCamelCase parent.name)}}
+    {{ asLowerCamelCase label }}: {{zapTypeToPythonClusterObjectType type ns=(asUpperCamelCase parent.name) cluster=parent.name}} = {{getPythonFieldDefault type ns=(asUpperCamelCase parent.name) cluster=parent.name}}
 {{/if}}
 {{/zcl_attributes_server}}
 
@@ -101,7 +101,7 @@
 {{#first}}
     class Structs:
 {{/first}}
-{{> struct_def cluster=(asUpperCamelCase parent.name) }}
+{{> struct_def cluster=parent.name }}
 
 {{/zcl_structs}}
 {{#zcl_commands}}
@@ -128,7 +128,7 @@
                 return ClusterObjectDescriptor(
                     Fields=[
                     {{#zcl_command_arguments}}
-                        ClusterObjectFieldDescriptor(Label="{{ asLowerCamelCase label }}", Tag={{ index }}, Type={{zapTypeToPythonClusterObjectType type ns=(asUpperCamelCase parent.parent.name)}}),
+                        ClusterObjectFieldDescriptor(Label="{{ asLowerCamelCase label }}", Tag={{ index }}, Type={{zapTypeToPythonClusterObjectType type ns=(asUpperCamelCase parent.parent.name) cluster=parent.parent.name}}),
                     {{/zcl_command_arguments}}
                     ])
             {{#if mustUseTimedInvoke}}
@@ -141,7 +141,7 @@
             {{#first}}
 
             {{/first}}
-            {{ asLowerCamelCase label }}: {{zapTypeToPythonClusterObjectType type ns=(asUpperCamelCase parent.parent.name)}} = {{getPythonFieldDefault type ns=(asUpperCamelCase parent.parent.name)}}
+            {{ asLowerCamelCase label }}: {{zapTypeToPythonClusterObjectType type ns=(asUpperCamelCase parent.parent.name) cluster=parent.parent.name}} = {{getPythonFieldDefault type ns=(asUpperCamelCase parent.parent.name) cluster=parent.parent.name}}
             {{/zcl_command_arguments}}
 
 {{/zcl_commands}}
@@ -168,15 +168,15 @@
             @ChipUtility.classproperty
             def attribute_type(cls) -> ClusterObjectFieldDescriptor:
             {{#if entryType}}
-                return ClusterObjectFieldDescriptor(Type={{zapTypeToPythonClusterObjectType entryType ns=(asUpperCamelCase parent.name)}})
+                return ClusterObjectFieldDescriptor(Type={{zapTypeToPythonClusterObjectType entryType ns=(asUpperCamelCase parent.name) cluster=parent.name}})
             {{else}}
-                return ClusterObjectFieldDescriptor(Type={{zapTypeToPythonClusterObjectType type ns=(asUpperCamelCase parent.name)}})
+                return ClusterObjectFieldDescriptor(Type={{zapTypeToPythonClusterObjectType type ns=(asUpperCamelCase parent.name) cluster=parent.name}})
             {{/if}}
 
             {{#if entryType}}
-            value: {{zapTypeToPythonClusterObjectType entryType ns=(asUpperCamelCase parent.name)}} = {{getPythonFieldDefault entryType ns=(asUpperCamelCase parent.name)}}
+            value: {{zapTypeToPythonClusterObjectType entryType ns=(asUpperCamelCase parent.name) cluster=parent.name}} = {{getPythonFieldDefault entryType ns=(asUpperCamelCase parent.name) cluster=parent.name}}
             {{else}}
-            value: {{zapTypeToPythonClusterObjectType type ns=(asUpperCamelCase parent.name)}} = {{getPythonFieldDefault type ns=(asUpperCamelCase parent.name)}}
+            value: {{zapTypeToPythonClusterObjectType type ns=(asUpperCamelCase parent.name) cluster=parent.name}} = {{getPythonFieldDefault type ns=(asUpperCamelCase parent.name) cluster=parent.name}}
             {{/if}}
 
 {{/zcl_attributes_server}}
@@ -199,14 +199,14 @@
                 return ClusterObjectDescriptor(
                     Fields=[
                     {{#zcl_event_fields}}
-                        ClusterObjectFieldDescriptor(Label="{{ asLowerCamelCase name }}", Tag={{ fieldIdentifier }}, Type={{zapTypeToPythonClusterObjectType type ns=(asUpperCamelCase parent.parent.name)}}),
+                        ClusterObjectFieldDescriptor(Label="{{ asLowerCamelCase name }}", Tag={{ fieldIdentifier }}, Type={{zapTypeToPythonClusterObjectType type ns=(asUpperCamelCase parent.parent.name) cluster=parent.parent.name}}),
                     {{/zcl_event_fields}}
                     ])
             {{#zcl_event_fields}}
             {{#first}}
 
             {{/first}}
-            {{ asLowerCamelCase name }}: {{zapTypeToPythonClusterObjectType type ns=(asUpperCamelCase parent.parent.name)}} = {{getPythonFieldDefault type ns=(asUpperCamelCase parent.parent.name)}}
+            {{ asLowerCamelCase name }}: {{zapTypeToPythonClusterObjectType type ns=(asUpperCamelCase parent.parent.name) cluster=parent.parent.name}} = {{getPythonFieldDefault type ns=(asUpperCamelCase parent.parent.name) cluster=parent.parent.name}}
             {{/zcl_event_fields}}
 
 {{/zcl_events}}
diff --git a/src/darwin/Framework/CHIP/templates/MTRBaseClusters-src.zapt b/src/darwin/Framework/CHIP/templates/MTRBaseClusters-src.zapt
index f90acdd..3aad2bf 100644
--- a/src/darwin/Framework/CHIP/templates/MTRBaseClusters-src.zapt
+++ b/src/darwin/Framework/CHIP/templates/MTRBaseClusters-src.zapt
@@ -120,7 +120,7 @@
                (wasIntroducedBeforeRelease "267F4B03-3256-4056-A62D-5237640FDCFE" (compatClusterNameRemapping parent.name) attribute=(compatAttributeNameRemapping parent.name name))))}}
 {{#*inline "attribute"}}Attribute{{asUpperCamelCase name preserveAcronyms=true}}{{/inline}}
 - (void)read{{>attribute}}With
-{{~#if_is_fabric_scoped_struct type~}}
+{{~#if_is_fabric_scoped_struct type cluster=../name~}}
   Params:(MTRReadParams * _Nullable)params completion:
 {{~else~}}
   Completion:
@@ -131,7 +131,7 @@
     [self.device _readKnownAttributeWithEndpointID:self.endpointID
                                          clusterID:@(TypeInfo::GetClusterId())
                                        attributeID:@(TypeInfo::GetAttributeId())
-    {{#if_is_fabric_scoped_struct type}}
+    {{#if_is_fabric_scoped_struct type cluster=../name}}
                                             params:params
     {{else}}
                                             params:nil
@@ -273,14 +273,14 @@
            (isSupported (compatClusterNameRemapping parent.name) attribute=(compatAttributeNameRemapping parent.name name)))}}
 {{#*inline "attribute"}}Attribute{{compatAttributeNameRemapping parent.name name}}{{/inline}}
 - (void)read{{>attribute}}With
-{{~#if_is_fabric_scoped_struct type~}}
+{{~#if_is_fabric_scoped_struct type cluster=../name~}}
   Params:(MTRReadParams * _Nullable)params completionHandler:
 {{~else~}}
   CompletionHandler:
 {{~/if_is_fabric_scoped_struct~}}
 (void (^)({{asObjectiveCClass type parent.name compatRemapClusterName=true}} * _Nullable value, NSError * _Nullable error))completionHandler
 {
-  [self readAttribute{{asUpperCamelCase name preserveAcronyms=true}}With{{#if_is_fabric_scoped_struct type}}Params:params completion:{{else}}Completion:{{/if_is_fabric_scoped_struct}}
+  [self readAttribute{{asUpperCamelCase name preserveAcronyms=true}}With{{#if_is_fabric_scoped_struct type cluster=../name}}Params:params completion:{{else}}Completion:{{/if_is_fabric_scoped_struct}}
       ^({{asObjectiveCClass type parent.name}} * _Nullable value, NSError * _Nullable error) {
         // Cast is safe because subclass does not add any selectors.
         completionHandler(static_cast<{{asObjectiveCClass type parent.name compatRemapClusterName=true}} *>(value), error);
diff --git a/src/darwin/Framework/CHIP/templates/MTRBaseClusters.zapt b/src/darwin/Framework/CHIP/templates/MTRBaseClusters.zapt
index 6ca88e8..7877b8d 100644
--- a/src/darwin/Framework/CHIP/templates/MTRBaseClusters.zapt
+++ b/src/darwin/Framework/CHIP/templates/MTRBaseClusters.zapt
@@ -57,7 +57,7 @@
 {{#if (isSupported (asUpperCamelCase parent.name preserveAcronyms=true) attribute=(asUpperCamelCase name preserveAcronyms=true))}}
 {{#*inline "attribute"}}Attribute{{asUpperCamelCase name preserveAcronyms=true}}{{/inline}}
 - (void)read{{>attribute}}With
-{{~#if_is_fabric_scoped_struct type~}}
+{{~#if_is_fabric_scoped_struct type cluster=../name~}}
   Params:(MTRReadParams * _Nullable)params completion:
 {{~else~}}
   Completion:
@@ -211,7 +211,7 @@
            (isSupported (compatClusterNameRemapping parent.name) attribute=(compatAttributeNameRemapping parent.name name)))}}
 {{#*inline "attribute"}}Attribute{{compatAttributeNameRemapping parent.name name}}{{/inline}}
 - (void)read{{>attribute}}With
-{{~#if_is_fabric_scoped_struct type~}}
+{{~#if_is_fabric_scoped_struct type cluster=../name~}}
   Params:(MTRReadParams * _Nullable)params completionHandler:
 {{~else~}}
   CompletionHandler: