package software.amazon.connect.quickconnect;

import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Sets;
import software.amazon.awssdk.services.connect.model.QuickConnect;
import software.amazon.awssdk.services.connect.model.QuickConnectType;

import java.util.Map;
import java.util.Set;

public class QuickConnectTestDataProvider {
    protected static final String QUICK_CONNECT_ARN = "arn:aws:connect:us-west-2:111111111111:instance/instanceId/transfer-destination/quickConnectId";
    protected static final String QUICK_CONNECT_ID = "quickConnectId";
    protected static final String CONTACT_FLOW_ARN = "arn:aws:connect:us-west-2:111111111111:instance/instanceId/contact-flow/contactFlowId";
    protected static final String CONTACT_FLOW_ID = "contactFlowId";
    protected static final String USER_ARN = "arn:aws:connect:us-west-2:111111111111:instance/instanceId/agent/userId";
    protected static final String USER_ID = "userId";
    protected static final String QUEUE_ARN = "arn:aws:connect:us-west-2:111111111111:instance/instanceId/queue/queueId";
    protected static final String QUEUE_ID = "queueId";
    protected static final String PHONE_NUMBER = "+1234567890";
    protected static final String CONTACT_FLOW_ID_2 = "contactFlowId2";
    protected static final String USER_ID_2 = "userId2";
    protected static final String QUEUE_ID_2 = "queueId2";
    protected static final String PHONE_NUMBER_2 = "+9876543210";
    protected static final String INSTANCE_ARN = "arn:aws:connect:us-west-2:111111111111:instance/instanceId";
    protected static final String QUICK_CONNECT_NAME_ONE = "quickConnectNameOne";
    protected static final String QUICK_CONNECT_DESCRIPTION_ONE = "quickConnectDescriptionOne";
    protected static final String QUICK_CONNECT_NAME_TWO = "quickConnectNameTwo";
    protected static final String QUICK_CONNECT_DESCRIPTION_TWO = "quickConnectDescriptionTwo";
    protected static final String QUICK_CONNECT_NAME_THREE = "quickConnectNameThree";
    protected static final String QUICK_CONNECT_DESCRIPTION_THREE = "quickConnectDescriptionThree";
    protected static final String VALID_TAG_KEY_ONE = "TagKeyOne";
    protected static final String VALID_TAG_VALUE_ONE = "A";
    protected static final String VALID_TAG_KEY_TWO = "TagKeyTwo";
    protected static final String VALID_TAG_VALUE_TWO = "B";
    protected static final String VALID_TAG_KEY_THREE = "TagKeyThree";
    protected static final String VALID_TAG_VALUE_THREE = "C";
    protected static final Map<String, String> TAGS_ONE = ImmutableMap.of(VALID_TAG_KEY_ONE, VALID_TAG_VALUE_ONE);
    protected static final Map<String, String> TAGS_TWO = ImmutableMap.of(VALID_TAG_KEY_THREE, VALID_TAG_VALUE_THREE,
            VALID_TAG_KEY_TWO, VALID_TAG_VALUE_TWO);
    protected static final Map<String, String> TAGS_THREE = ImmutableMap.of(VALID_TAG_KEY_ONE, VALID_TAG_VALUE_ONE,
            VALID_TAG_KEY_THREE, VALID_TAG_VALUE_THREE);
    protected static final Set<Tag> TAGS_SET_ONE = convertTagMapToSet(TAGS_ONE);
    protected static final Set<Tag> TAGS_SET_TWO = convertTagMapToSet(TAGS_TWO);

    protected static QuickConnect getDescribeQuickConnectResponseObjectWithQuickConnectTypeUser() {
        final software.amazon.awssdk.services.connect.model.UserQuickConnectConfig userQuickConnectConfig =
                software.amazon.awssdk.services.connect.model.UserQuickConnectConfig
                        .builder()
                        .contactFlowId(CONTACT_FLOW_ID)
                        .userId(USER_ID)
                        .build();

        final software.amazon.awssdk.services.connect.model.QuickConnectConfig quickConnectConfigTypeUser = software.amazon.awssdk.services.connect.model.QuickConnectConfig
                .builder()
                .quickConnectType(QuickConnectType.USER.toString())
                .userConfig(userQuickConnectConfig)
                .build();

        return QuickConnect.builder()
                .quickConnectARN(QUICK_CONNECT_ARN)
                .quickConnectId(QUICK_CONNECT_ID)
                .name(QUICK_CONNECT_NAME_ONE)
                .description(QUICK_CONNECT_DESCRIPTION_ONE)
                .tags(TAGS_ONE)
                .quickConnectConfig(quickConnectConfigTypeUser)
                .build();
    }

    protected static QuickConnect getDescribeQuickConnectResponseObjectWithQuickConnectTypeQueue() {
        final software.amazon.awssdk.services.connect.model.QueueQuickConnectConfig queueQuickConnectConfig =
                software.amazon.awssdk.services.connect.model.QueueQuickConnectConfig
                        .builder()
                        .contactFlowId(CONTACT_FLOW_ID)
                        .queueId(QUEUE_ID)
                        .build();

        final software.amazon.awssdk.services.connect.model.QuickConnectConfig quickConnectConfigTypeQueue = software.amazon.awssdk.services.connect.model.QuickConnectConfig
                .builder()
                .quickConnectType(QuickConnectType.QUEUE.toString())
                .queueConfig(queueQuickConnectConfig)
                .build();

        return QuickConnect.builder()
                .quickConnectARN(QUICK_CONNECT_ARN)
                .quickConnectId(QUICK_CONNECT_ID)
                .name(QUICK_CONNECT_NAME_TWO)
                .description(QUICK_CONNECT_DESCRIPTION_TWO)
                .tags(TAGS_TWO)
                .quickConnectConfig(quickConnectConfigTypeQueue)
                .build();
    }

    protected static QuickConnect getDescribeQuickConnectResponseObjectWithQuickConnectTypePhoneNumber() {
        final software.amazon.awssdk.services.connect.model.PhoneNumberQuickConnectConfig phoneNumberQuickConnectConfig =
                software.amazon.awssdk.services.connect.model.PhoneNumberQuickConnectConfig
                        .builder()
                        .phoneNumber(PHONE_NUMBER)
                        .build();

        final software.amazon.awssdk.services.connect.model.QuickConnectConfig quickConnectConfigTypePhoneNumber = software.amazon.awssdk.services.connect.model.QuickConnectConfig
                .builder()
                .quickConnectType(QuickConnectType.PHONE_NUMBER.toString())
                .phoneConfig(phoneNumberQuickConnectConfig)
                .build();

        return QuickConnect.builder()
                .quickConnectARN(QUICK_CONNECT_ARN)
                .quickConnectId(QUICK_CONNECT_ID)
                .name(QUICK_CONNECT_NAME_THREE)
                .description(QUICK_CONNECT_DESCRIPTION_THREE)
                .tags(TAGS_ONE)
                .quickConnectConfig(quickConnectConfigTypePhoneNumber)
                .build();
    }

    protected static ResourceModel buildQuickConnectResourceModelWithQuickConnectTypeUser() {

        final QuickConnectConfig quickConnectConfigTypeUser = QuickConnectConfig
                .builder()
                .quickConnectType(QuickConnectType.USER.toString())
                .userConfig(getUserQuickConnectConfig())
                .build();

        return ResourceModel.builder()
                .quickConnectArn(QUICK_CONNECT_ARN)
                .instanceArn(INSTANCE_ARN)
                .name(QUICK_CONNECT_NAME_ONE)
                .description(QUICK_CONNECT_DESCRIPTION_ONE)
                .quickConnectConfig(quickConnectConfigTypeUser)
                .tags(TAGS_SET_ONE)
                .build();
    }

    protected static ResourceModel buildQuickConnectResourceModelWithQuickConnectTypeQueue() {
        final QuickConnectConfig quickConnectConfigTypeQueue = QuickConnectConfig
                .builder()
                .quickConnectType(QuickConnectType.QUEUE.toString())
                .queueConfig(getQueueQuickConnectConfig())
                .build();

        return ResourceModel.builder()
                .quickConnectArn(QUICK_CONNECT_ARN)
                .instanceArn(INSTANCE_ARN)
                .name(QUICK_CONNECT_NAME_TWO)
                .description(QUICK_CONNECT_DESCRIPTION_TWO)
                .quickConnectConfig(quickConnectConfigTypeQueue)
                .tags(TAGS_SET_TWO)
                .build();
    }


    protected static ResourceModel buildQuickConnectResourceModelWithQuickConnectTypePhoneNumber() {
        final QuickConnectConfig quickConnectConfigTypePhoneNumber = QuickConnectConfig
                .builder()
                .quickConnectType(QuickConnectType.PHONE_NUMBER.toString())
                .phoneConfig(getPhoneQuickConnectConfig())
                .build();

        return ResourceModel.builder()
                .quickConnectArn(QUICK_CONNECT_ARN)
                .instanceArn(INSTANCE_ARN)
                .name(QUICK_CONNECT_NAME_THREE)
                .description(QUICK_CONNECT_DESCRIPTION_THREE)
                .quickConnectConfig(quickConnectConfigTypePhoneNumber)
                .tags(TAGS_SET_ONE)
                .build();
    }

    protected static UserQuickConnectConfig getUserQuickConnectConfig() {
        return UserQuickConnectConfig
                .builder()
                .userArn(USER_ID)
                .contactFlowArn(CONTACT_FLOW_ID)
                .build();
    }

    protected static QueueQuickConnectConfig getQueueQuickConnectConfig() {
        return QueueQuickConnectConfig
                .builder()
                .queueArn(QUEUE_ID)
                .contactFlowArn(CONTACT_FLOW_ID)
                .build();
    }

    protected static PhoneNumberQuickConnectConfig getPhoneQuickConnectConfig() {
        return PhoneNumberQuickConnectConfig
                .builder()
                .phoneNumber(PHONE_NUMBER)
                .build();
    }

    private static Set<Tag> convertTagMapToSet(Map<String, String> tagMap) {
        Set<Tag> tags = Sets.newHashSet();
        if (tagMap != null) {
            tagMap.forEach((key, value) -> tags.add(Tag.builder().key(key).value(value).build()));
        }
        return tags;
    }
}