package software.amazon.m2.environment;

import software.amazon.awssdk.services.m2.model.GetEnvironmentResponse;
import software.amazon.awssdk.services.m2.model.HighAvailabilityConfig;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map;

public class TestDataProvider {

    static ResourceModel resourceModel() {

        return ResourceModel.builder()
                .environmentId("env-id")
                .environmentArn("arn:aws:m2:us-west-2:123456:env/env-id")
                .name("env-name")
                .instanceType("m2.m5.large")
                .engineType("microfocus")
                .engineVersion("7.0.3")
                .description("for testing cfn")
                .subnetIds(List.of("subnet-id-1"))
                .securityGroupIds(List.of("sec-g1"))
                .storageConfigurations(List.of(StorageConfiguration.builder()
                        .fsx(FsxStorageConfiguration.builder().mountPoint("/mnt/fsx").fileSystemId("fsx-id").build())
                        .efs(EfsStorageConfiguration.builder().mountPoint("mnt/efs").fileSystemId("efs-123").build())
                        .build()))
                .publiclyAccessible(true)
                .highAvailabilityConfig(software.amazon.m2.environment.HighAvailabilityConfig.builder().desiredCapacity(2).build())
                .tags(Map.of("key1", "val1", "key2", "val2"))
                .preferredMaintenanceWindow("thu:10:00-thu:12:00")
                .build();
    }

    static GetEnvironmentResponse getEnvironmentResponseFromModel(ResourceModel model, String envId, String status) {
        GetEnvironmentResponse.Builder responseBuilder = GetEnvironmentResponse.builder();
        if (envId != null) {
            responseBuilder.environmentId(envId);
        }
        if (model.getEnvironmentArn() != null) {
            responseBuilder.environmentArn(model.getEnvironmentArn());
        }
        if (model.getName() != null) {
            responseBuilder.name(model.getName());
        }
        if (model.getEngineType() != null) {
            responseBuilder.engineType(model.getEngineType());
        }
        if (model.getEngineVersion() != null) {
            responseBuilder.engineVersion(model.getEngineVersion());
        }
        if (model.getInstanceType() != null) {
            responseBuilder.instanceType(model.getInstanceType());
        }
        if (model.getDescription() != null) {
            responseBuilder.description(model.getDescription());
        }
        if (model.getSubnetIds() != null && !model.getSecurityGroupIds().isEmpty()) {
            responseBuilder.subnetIds(model.getSubnetIds());
        }
        if (model.getSecurityGroupIds() != null && !model.getSecurityGroupIds().isEmpty()) {
            responseBuilder.securityGroupIds(model.getSecurityGroupIds());
        }
        if (model.getStorageConfigurations() != null && !model.getStorageConfigurations().isEmpty()) {
            responseBuilder.storageConfigurations(getStorageConfigs(model.getStorageConfigurations()));
        }
        if (model.getPubliclyAccessible() != null) {
            responseBuilder.publiclyAccessible(model.getPubliclyAccessible());
        }
        if (model.getHighAvailabilityConfig() != null) {
            responseBuilder.highAvailabilityConfig(HighAvailabilityConfig.builder().desiredCapacity(
                            model.getHighAvailabilityConfig().getDesiredCapacity()).build());
        }
        if (model.getTags() != null && !model.getTags().isEmpty()) {
            responseBuilder.tags(model.getTags());
        }
        if (model.getPreferredMaintenanceWindow() != null) {
            responseBuilder.preferredMaintenanceWindow(model.getPreferredMaintenanceWindow());
        }
        responseBuilder.status(status);

        return responseBuilder.build();
    }

    private static Collection<software.amazon.awssdk.services.m2.model.StorageConfiguration> getStorageConfigs(
            List<software.amazon.m2.environment.StorageConfiguration> storageConfigurations) {

        Collection<software.amazon.awssdk.services.m2.model.StorageConfiguration> storageConfigs = new ArrayList<>();
        if (storageConfigurations != null && !storageConfigurations.isEmpty()) {
            for (software.amazon.m2.environment.StorageConfiguration stg : storageConfigurations) {
                software.amazon.awssdk.services.m2.model.StorageConfiguration.Builder stgBuilder =
                        software.amazon.awssdk.services.m2.model.StorageConfiguration.builder();
                if (stg.getEfs() != null) {
                    stgBuilder.efs(software.amazon.awssdk.services.m2.model.EfsStorageConfiguration.builder()
                            .mountPoint(stg.getEfs().getMountPoint())
                            .fileSystemId(stg.getEfs().getFileSystemId())
                            .build());
                }
                if (stg.getFsx() != null) {
                    stgBuilder.fsx(software.amazon.awssdk.services.m2.model.FsxStorageConfiguration.builder()
                            .mountPoint(stg.getFsx().getMountPoint())
                            .fileSystemId(stg.getFsx().getFileSystemId())
                            .build());
                }
                storageConfigs.add(stgBuilder.build());
            }
        }
        return storageConfigs;
    }
}