package software.amazon.connect.quickconnect;

import software.amazon.awssdk.services.connect.ConnectClient;
import software.amazon.awssdk.services.connect.model.CreateQuickConnectRequest;
import software.amazon.awssdk.services.connect.model.CreateQuickConnectResponse;
import software.amazon.cloudformation.proxy.AmazonWebServicesClientProxy;
import software.amazon.cloudformation.proxy.Logger;
import software.amazon.cloudformation.proxy.ProgressEvent;
import software.amazon.cloudformation.proxy.ProxyClient;
import software.amazon.cloudformation.proxy.ResourceHandlerRequest;

import java.util.Map;

public class CreateHandler extends BaseHandlerStd {

    @Override
    public ProgressEvent<ResourceModel, CallbackContext> handleRequest(
            final AmazonWebServicesClientProxy proxy,
            final ResourceHandlerRequest<ResourceModel> request,
            final CallbackContext callbackContext,
            final ProxyClient<ConnectClient> proxyClient,
            final Logger logger) {

        final ResourceModel model = request.getDesiredResourceState();
        final Map<String, String> tags = request.getDesiredResourceTags();

        logger.log(String.format("Invoked CreateQuickConnectHandler with InstanceId:%s ,QuickConnectName:%s, " +
                "QuickConnectType:%s", model.getInstanceArn(), model.getName(), model.getQuickConnectConfig().getQuickConnectType()));

        return proxy.initiate("connect::createQuickConnect", proxyClient, model, callbackContext)
                .translateToServiceRequest(resourceModel -> translateToCreateQuickConnectRequest(resourceModel, tags))
                .makeServiceCall((req, clientProxy) -> invoke(req, clientProxy, clientProxy.client()::createQuickConnect, logger))
                .done(response -> ProgressEvent.defaultSuccessHandler(setQuickConnectIdentifier(model, response)));
    }

    private CreateQuickConnectRequest translateToCreateQuickConnectRequest(final ResourceModel model, final Map<String, String> tags) {
        return CreateQuickConnectRequest
                .builder()
                .instanceId(model.getInstanceArn())
                .name(model.getName())
                .description(model.getDescription())
                .tags(tags)
                .quickConnectConfig(translateToQuickConnectConfig(model))
                .build();
    }

    private ResourceModel setQuickConnectIdentifier(final ResourceModel model, final CreateQuickConnectResponse createQuickConnectResponse) {
        model.setQuickConnectArn(createQuickConnectResponse.quickConnectARN());
        return model;
    }
}