<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements.  See the NOTICE file
distributed with this work for additional information
regarding copyright ownership.  The ASF licenses this file
to you 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.
-->

{{ $scheduler := .Get 0 }}
{{ $configFile := .Get 1 }}

{{ $schedulerConfigs := index .Site.Data.configs $scheduler }}
{{ $fileConfigs := index $schedulerConfigs "configfiles" }}

{{ range $fileConfigs }}
{{ if eq $configFile .file }}
{{ if isset $.Site.Data.configs.descriptions $configFile }}
<p>{{ index $.Site.Data.configs.descriptions $configFile | markdownify }}</p>
{{ end }}
<table>
  <thead>
    <tr>
      <th>Parameter</th>
      <th>Description</th>
      <th>Default</th>
    </tr>
  </thead>
  <tbody>
    {{ range .configs }}
    {{ if not .subconfigs }}
    <tr>
      <td><code>{{ .name }}</code></td>
      <td>{{ if .description }}{{ .description | markdownify }}{{ end }}</td>
      <td>{{ if .default }}<code>{{ .default }}</code>{{ end }}</td>
    </tr>
    {{ else }}
    <tr>
        <td><code>{{ .name }}</code></td>
        <td>
          <p>The <code>{{ .name }}</code> parameter has multiple sub-parameters:</p>
          <table>
            <thead>
              <tr>
                <th>Parameter</th>
                <th>Description</th>
                <th>Default</th>
              </tr>
            </thead>
            <tbody>
              {{ range .subconfigs }}
              <tr>
                <td><code>{{ .name }}</code></td>
                <td>{{ if .description }}{{ .description | markdownify }}{{ end }}</td>
                <td>{{ if .default }}<code>{{ .default }}</code>{{ end }}</td>
              </tr>
              {{ end }}
            </tbody>
          </table>
        </td>
        <td>{{ if .default }}<code>{{ .default }}</code>{{ end }}</td>
      </tr>
    {{ end }}
    {{ end }}
  </tbody>
</table>
{{ end }} <!-- if eq $configFile .file -->
{{ end }} <!-- range $fileConfigs -->
