/*
 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License").
 * You may not use this file except in compliance with the License.
 * A copy of the License is located at
 *
 *  http://aws.amazon.com/apache2.0
 *
 * or in the "license" file accompanying this file. This file is distributed
 * on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
 * express or implied. See the License for the specific language governing
 * permissions and limitations under the License.
 */

package utils.resources;

import java.time.Duration;
import software.amazon.awssdk.testutils.Waiter;
import software.amazon.awssdk.utils.Logger;
import utils.resources.RequiredResources.ResourceCreationPolicy;
import utils.resources.TestResource.ResourceStatus;


public class TestResourceUtils {
    private static final Logger log = Logger.loggerFor(TestResourceUtils.class);

    public static void createResource(TestResource resource, ResourceCreationPolicy policy) throws InterruptedException {
        TestResource.ResourceStatus finalizedStatus = waitForFinalizedStatus(resource);
        if (policy == ResourceCreationPolicy.ALWAYS_RECREATE) {
            if (finalizedStatus != ResourceStatus.NOT_EXIST) {
                resource.delete(true);
            }
            resource.create(true);
        } else if (policy == ResourceCreationPolicy.REUSE_EXISTING) {
            switch (finalizedStatus) {
                case AVAILABLE:
                    log.info(() -> "Found existing resource " + resource + " that could be reused...");
                    return;
                case EXIST_INCOMPATIBLE_RESOURCE:
                    resource.delete(true);
                    resource.create(true);
                    // fallthru
                case NOT_EXIST:
                    resource.create(true);
                    break;
                default:
                    break;
            }
        }
    }

    public static void deleteResource(TestResource resource) throws InterruptedException {
        ResourceStatus finalizedStatus = waitForFinalizedStatus(resource);
        if (finalizedStatus != ResourceStatus.NOT_EXIST) {
            resource.delete(false);
        }
    }

    public static ResourceStatus waitForFinalizedStatus(TestResource resource) throws InterruptedException {
        return Waiter.run(resource::getResourceStatus)
                     .until(s -> s != ResourceStatus.TRANSIENT)
                     .orFailAfter(Duration.ofMinutes(10));
    }
}
