"""
Module containing a small client which connects to the broker and
gets the broker connection properties so as to identify the broker.
"""

#
# 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.
#

import sys
import proton.handlers
import proton.reactor
from qpid_interop_test.qit_errors import InteropTestError

class Client(proton.handlers.MessagingHandler):
    """
    Client to connect to broker and collect connection properties, used to identify the test broker
    """
    def __init__(self, url, max_num_retries):
        super(Client, self).__init__()
        self.url = url
        self.max_num_retries = max_num_retries;
        self.num_retries = 0
        self.remote_properties = None

    def on_start(self, event):
        """Event loop start"""
        event.container.connect(url=self.url, sasl_enabled=False)

    def on_connection_remote_open(self, event):
        """Callback for remote connection open"""
        if self.num_retries > 0:
            print(' broker found.')
        self.remote_properties = event.connection.remote_properties
        event.connection.close()

    def get_connection_properties(self):
        """Return the connection properties"""
        return self.remote_properties

    def on_transport_error(self, event):
        self.num_retries += 1
        if (self.num_retries == 1):
            sys.stdout.write('WARNING: broker not found at %s, retrying *' % self.url)
            sys.stdout.flush()
        elif (self.num_retries <= self.max_num_retries):
            sys.stdout.write(' *')
            sys.stdout.flush()
        else:
            print('')
            raise InteropTestError('ERROR: broker not found at %s after %d retries' % (self.url, self.max_num_retries))

def get_broker_properties(broker_url):
    """Start client, then return its connection properties"""
    msg_handler = Client(broker_url, 25)
    proton.reactor.Container(msg_handler).run()
    return msg_handler.get_connection_properties()
