{%- set hasSubscribe = false -%}
{%- set hasPublish = false -%}
{%- for channelName, channel in asyncapi.channels() -%}
    {%- if channel.hasPublish() -%}
        {%- set hasPublish = true -%}
    {%- endif -%}
    {%- if channel.hasSubscribe() -%}
        {%- set hasSubscribe = true -%}
    {%- endif -%}
{%- endfor -%}

  {%- for serverName, server in asyncapi.servers() %}{% if server.protocol() == 'amqp' %}
amqp:
  broker: {% for line in server.description() | splitByLines %}
    # {{line | safe}}{% endfor %}
    host: {% if server.variable('port') %}{{server.url() | replace('{port}', server.variable('port').defaultValue())}}{% else %}{{server.url()}}{% endif %}
    port: {% if server.variable('port') %}{{server.variable('port').defaultValue()}}{% endif %}
    username: {% if server.variable('username') %}{{server.variable('username').defaultValue()}}{% endif %}
    password:
  {% for channelName, channel in asyncapi.channels() %}
  {{channelName | toAmqpNeutral(channel.hasParameters(), channel.parameters())}}:
    {% if channel.binding('amqp') and channel.binding('amqp').exchange %}exchange: {{channel.binding('amqp').exchange.name}}{% endif %}
    routingKey: {{channelName | toAmqpKey(channel.hasParameters(), channel.parameters())}}
    {% if channel.binding('amqp') and channel.binding('amqp').queue %}queue: {{channel.binding('amqp').queue.name}}{% endif %}
  {% endfor %}
  {% endif %}

{% if server.protocol() == 'mqtt' %}
mqtt:
  broker: {% for line in server.description() | splitByLines %}
    # {{line | safe}}{% endfor %}
    address: {% if server.variable('port') %}{{server.url() | replace('{port}', server.variable('port').defaultValue())}}{% else %}{{server.url()}}{% endif %}
    username:
    password:
    {% if params.mqttClientId %}
    clientId : {{ params.mqttClientId }}
    {% elif server.binding('mqtt') and server.binding('mqtt').clientId %}
    clientId: {{ server.binding('mqtt').clientId }}
    {% else %}
    clientId: default
    {% endif %}
    {% if server.binding('mqtt') and server.binding('mqtt').cleanSession | isDefined %}cleanSession: {{server.binding('mqtt').cleanSession}}{% endif %}
    {% if server.binding('mqtt') and server.binding('mqtt').lastWill %}lastWill:
      topic: {{server.binding('mqtt').lastWill.topic}}
      message: {{server.binding('mqtt').lastWill.message}}
      qos: {{server.binding('mqtt').lastWill.qos}}
      retain: {{server.binding('mqtt').lastWill.retain}}
    {% endif %}
    timeout:
      completion: {{params.completionTimeout}}
      disconnection: {{params.disconnectionTimeout}}
      connection: {{params.connectionTimeout}}
      {% if server.binding('mqtt') and server.binding('mqtt').keepAlive | isDefined %}keepAlive: {{server.binding('mqtt').keepAlive}}{% endif %}
  topic:
    {%- for channelName, channel in asyncapi.channels() %}{% if channel.hasPublish() %}
    {{channel.publish().id() | camelCase}}: {{channelName | toMqttTopicString(channel.hasParameters(), channel.parameters()) }}
    {%- elif channel.hasSubscribe() %}
    {{channel.subscribe().id() | camelCase}}: {{channelName}}
    {%- endif %}{% endfor %}
{% endif %}{% endfor %}

{%- if asyncapi | isProtocol('kafka') %}
spring:
  kafka: {% for serverName, server in asyncapi.servers() %}
    # - {{serverName}} in {{server.url()}} : {% for line in server.description() | splitByLines %}
    # {{line | safe}}{% endfor %}{% endfor %}
    bootstrap-servers: {% for serverName, server in asyncapi.servers() %}{% if server.variable('port') %}{{server.url() | replace('{port}', server.variable('port').defaultValue())}}{% else %}{{server.url()}}{% endif %}{% if not loop.last %},{% endif %}{% endfor %}
  {%- if hasPublish %}
    listener:
      poll-timeout: {{params.listenerPollTimeout}}
      concurrency: {{params.listenerConcurrency}}
  {% endif %}
{% endif %}