### Elasticsearch Version

7.x, 8.x

### Installed Plugins

_No response_

### Java Version

_bundled_

### OS Version

Darwin 

### Problem Description

A data stream must have an index template that matches it in order to exist.
When managing index templates we want to make sure we don't leave a
data stream without a [corresponding index template](https://github.com/elastic/elasticsearch/blob/acf9968f9d397d755d5ad9fcf815cca23bbeda61/server/src/main/java/org/elasticsearch/cluster/metadata/MetadataIndexTemplateService.java#L918).

The `dataStreamsUsingTemplate` check uses the index pattern of the index 
templates to conclude if a template is used by a data stream, however it should
be enhanced to check the priority too as there can only be only one index template
that matches a data stream and it's the one with the highest priority.

### Steps to Reproduce

Create an ILM policy
```
PUT _ilm/policy/testing_yo
{
  "policy": {
    "phases": {
      "warm": {
	"actions": {
	  "shrink": {
          "number_of_shards": 1
	  }
        }
      }
    } 
  }
}
```

Create an index template with the `data_stream` option:
```
PUT _index_template/logs_data_stream
{
	"index_patterns": [ "logs*", "te*", "bar*" ],
	"data_stream": {},
        "priority": 100,
	"template" : {
	  "settings": {
            "index.number_of_shards": 3,
	    "index.lifecycle.name": "testing"
	  }
	}
}
```

Create the data stream
```
POST logs_test/_doc 
{
  "message": "testing",
  "@timestamp": "1591890611"
}
```

Create a new index template that would match this data stream with a higher priority
```
PUT _index_template/higher_logs_data_stream
{
	"index_patterns": [ "logs*", "te*", "bar*" ],
	"data_stream": {},
        "priority": 500,
	"template" : {
	  "settings": {
            "index.number_of_shards": 3,
	    "index.lifecycle.name": "testing"
	  }
	}
}
```

Attempt to delete the previous, lower priority index template:
```
DELETE _index_template/logs_data_stream
```

### Logs (if relevant)

_No response_
server/src/main/java/org/elasticsearch/cluster/metadata/MetadataIndexTemplateService.java
* Finds index templates whose index pattern matched with the given index name. In the case of
     * hidden indices, a template with a match all pattern or global template will not be returned.
     *
     * @param metadata The {@link Metadata} containing all of the {@link IndexTemplateMetadata} values
     * @param indexName The name of the index that templates are being found for
     * @param isHidden Whether or not the index is known to be hidden. May be {@code null} if the index
     *                 being hidden has not been explicitly requested. When {@code null} if the result
     *                 of template application results in a hidden index, then global templates will
     *                 not be returned
     * @return a list of templates sorted by {@link IndexTemplateMetadata#order()} descending.
     *
     */
    public static List<IndexTemplateMetadata> findV1Templates(Metadata metadata, String indexName, @Nullable Boolean isHidden) {
        final String resolvedIndexName = IndexNameExpressionResolver.DateMathExpressionResolver.resolveExpression(indexName);
        final Predicate<String> patternMatchPredicate = pattern -> Regex.simpleMatch(pattern, resolvedIndexName);
        final List<IndexTemplateMetadata> matchedTemplates = new ArrayList<>();
        for (IndexTemplateMetadata template : metadata.templates().values()) {
            if (isHidden == null || isHidden == Boolean.FALSE) {
                final boolean matched = template.patterns().stream().anyMatch(patternMatchPredicate);
                if (matched) {
                    matchedTemplates.add(template);
                }
            } else {
                assert isHidden == Boolean.TRUE;
                final boolean isNotMatchAllTemplate = template.patterns().stream().noneMatch(Regex::isMatchAllPattern);
                if (isNotMatchAllTemplate) {
                    if (template.patterns().stream().anyMatch(patternMatchPredicate)) {
                        matchedTemplates.add(template);
                    }
                }