package com.coveo.configuration.parameterstore;

import com.amazonaws.services.simplesystemsmanagement.AWSSimpleSystemsManagement;
import com.amazonaws.services.simplesystemsmanagement.model.GetParameterRequest;
import com.amazonaws.services.simplesystemsmanagement.model.GetParameterResult;
import com.amazonaws.services.simplesystemsmanagement.model.ParameterNotFoundException;
import com.coveo.configuration.parameterstore.exception.ParameterStoreError;
import com.coveo.configuration.parameterstore.exception.ParameterStoreParameterNotFoundError;

public class ParameterStoreSource
{
    private AWSSimpleSystemsManagement ssmClient;
    private boolean haltBoot;

    public ParameterStoreSource(AWSSimpleSystemsManagement ssmClient, boolean haltBoot)
    {
        this.ssmClient = ssmClient;
        this.haltBoot = haltBoot;
    }

    public Object getProperty(String propertyName)
    {
        try {
            GetParameterResult getParameterResult = ssmClient.getParameter(new GetParameterRequest().withName(propertyName)
                                                                                                    .withWithDecryption(true));
            validate(propertyName, getParameterResult);
            return getParameterResult.getParameter().getValue();
        } catch (ParameterNotFoundException e) {
            if (haltBoot) {
                throw new ParameterStoreParameterNotFoundError(propertyName, e);
            }
        } catch (Exception e) {
            throw new ParameterStoreError(propertyName, e);
        }
        return null;
    }

    private void validate(String propertyName, GetParameterResult getParameterResult)
    {
        String requestId = getParameterResult.getSdkResponseMetadata().getRequestId();
        int statusCode = getParameterResult.getSdkHttpMetadata().getHttpStatusCode();
        if (statusCode != 200) {
            throw new ParameterStoreError(propertyName,
                                          String.format("Invalid response code '%s' received from AWS. AWS Request ID : '%s'.",
                                                        statusCode,
                                                        requestId));
        }

        if (getParameterResult.getParameter() == null) {
            throw new ParameterStoreError(propertyName,
                                          String.format("A null Parameter was received from AWS. AWS Request ID : '%s'.",
                                                        requestId));
        }

        if (getParameterResult.getParameter().getValue() == null) {
            throw new ParameterStoreError(propertyName,
                                          String.format("A null Parameter value was received from AWS. AWS Request ID : '%s'.",
                                                        requestId));
        }
    }
}