package com.sap.refapps.espm.config;

import com.sap.cloud.servicesdk.xbem.core.MessagingService;
import com.sap.cloud.servicesdk.xbem.core.MessagingServiceFactory;
import com.sap.cloud.servicesdk.xbem.core.exception.MessagingException;
import com.sap.cloud.servicesdk.xbem.core.impl.MessagingServiceFactoryCreator;
import com.sap.cloud.servicesdk.xbem.extension.sapcp.jms.MessagingServiceJmsConnectionFactory;
import com.sap.cloud.servicesdk.xbem.extension.sapcp.jms.MessagingServiceJmsSettings;
import org.springframework.cloud.Cloud;
import org.springframework.cloud.CloudFactory;


import org.springframework.cloud.service.ServiceConnectorConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;

@Configuration
@Profile("cloud")
public class EnterpriseMessagingConfig {

    @Bean
    public MessagingServiceFactory getMessagingServiceFactory() {
        ServiceConnectorConfig config = null; // currently there are no configurations for the MessagingService supported
        Cloud cloud = new CloudFactory().getCloud();
        // get the MessagingService via the service connector
        MessagingService messagingService = cloud.getSingletonServiceConnector(MessagingService.class, config);
        if (messagingService == null) {
            throw new IllegalStateException("Unable to create the MessagingService.");
        }
        return MessagingServiceFactoryCreator.createFactory(messagingService);
    }

    @Bean
    public MessagingServiceJmsConnectionFactory getMessagingServiceJmsConnectionFactory(MessagingServiceFactory messagingServiceFactory) {
        try {
            /*
             * The settings object is preset with default values (see JavaDoc)
             * and can be adjusted. The settings aren't required and depend on
             * the use-case. Note: a connection will be closed after an idle
             * time of 5 minutes.
             */

            MessagingServiceJmsSettings settings = new MessagingServiceJmsSettings();
            settings.setMaxReconnectAttempts(2); // use -1 for unlimited attempts
            settings.setInitialReconnectDelay(3000);
            settings.setReconnectDelay(3000);
            return messagingServiceFactory.createConnectionFactory(MessagingServiceJmsConnectionFactory.class, null);
        } catch (MessagingException e) {
            throw new IllegalStateException("Unable to create the Connection Factory", e);
        }
    }





}