/*
 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
 * SPDX-License-Identifier: Apache-2.0
 */

package software.amazon.greengrassv2.deployment;

import com.google.common.collect.ImmutableMap;
import software.amazon.cloudformation.proxy.ResourceHandlerRequest;

import java.util.Map;

public class TestUtils {
    public static final String TEST_THING_GROUP_ARN = "arn:aws:iot:us-east-1:123456789012:thinggroup/testThingGroup";
    public static final String TEST_THING_GROUP_ARN_1 = "arn:aws:iot:us-east-1:123456789012:thinggroup/testThingGroup1";
    public static final String TEST_DEPLOYMENT_NAME = "testDeployment";
    public static final String TEST_DEPLOYMENT_NAME_1 = "testDeployment1";
    public static final String TEST_DEPLOYMENT_ID = "0123456789";
    public static final String TEST_NEXT_TOKEN = "nextToken";
    public static final Map<String, String> TEST_TAGS_1 = ImmutableMap.of("key1", "value1");
    public static final Map<String, String> TEST_TAGS_2 = ImmutableMap.of("key2", "value2");

    private static final String TEST_COMPONENT_NAME = "testComponentName";
    private static final String TEST_COMPONENT_VERSION = "1.0.0";
    private static final Integer TEST_IN_PROGRESS_TIMEOUT = 10;
    private static final String TEST_COMPONENT_UPDATE_POLICY = "NOTIFY_COMPONENTS";

    private static final Map<String, ComponentDeploymentSpecification> TEST_COMPONENT_MAP = ImmutableMap.of(
            TEST_COMPONENT_NAME, ComponentDeploymentSpecification.builder()
                    .componentVersion(TEST_COMPONENT_VERSION)
                    .build());

    private static final DeploymentIoTJobConfiguration TEST_JOB_CONFIGURATION = DeploymentIoTJobConfiguration.builder()
            .timeoutConfig(IoTJobTimeoutConfig.builder()
                    .inProgressTimeoutInMinutes(TEST_IN_PROGRESS_TIMEOUT)
                    .build())
            .build();

    private static final DeploymentPolicies TEST_DEPLOYMENT_POLICIES = DeploymentPolicies.builder()
            .componentUpdatePolicy(DeploymentComponentUpdatePolicy.builder()
                    .action(TEST_COMPONENT_UPDATE_POLICY)
                    .build())
            .build();

    public static final ResourceModel TEST_MODEL = ResourceModel.builder()
            .deploymentId(TEST_DEPLOYMENT_ID)
            .deploymentName(TEST_DEPLOYMENT_NAME)
            .targetArn(TEST_THING_GROUP_ARN)
            .build();

    // Here are models where each model is different from TEST_VALID_MODEL with one not-updatable attribute respectively.
    public static final ResourceModel TEST_MODEL_DIFF_TARGET_ARN = TEST_MODEL.toBuilder().targetArn(TEST_THING_GROUP_ARN_1).build();
    public static final ResourceModel TEST_MODEL_DIFF_DEPLOYMENT_NAME = TEST_MODEL.toBuilder().deploymentName(TEST_DEPLOYMENT_NAME_1).build();
    public static final ResourceModel TEST_MODEL_DIFF_COMPONENTS = TEST_MODEL.toBuilder().components(TEST_COMPONENT_MAP).build();
    public static final ResourceModel TEST_MODEL_DIFF_JOB_CONFIGURATION = TEST_MODEL.toBuilder().iotJobConfiguration(TEST_JOB_CONFIGURATION).build();
    public static final ResourceModel TEST_MODEL_DIFF_DEPLOYMENT_POLICIES = TEST_MODEL.toBuilder().deploymentPolicies(TEST_DEPLOYMENT_POLICIES).build();

    public static final ResourceHandlerRequest<ResourceModel> TEST_UPDATE_REQUEST = ResourceHandlerRequest.<ResourceModel>builder()
            .awsPartition("aws")
            .region("us-east-1")
            .previousResourceState(TEST_MODEL)
            .previousResourceTags(TEST_TAGS_1)
            .desiredResourceState(TEST_MODEL)
            .desiredResourceTags(TEST_TAGS_2)
            .build();
}