/*
 * Camel ApiCollection generated by camel-api-component-maven-plugin
 */
package org.apache.camel.component.braintree.internal;

import java.util.Arrays;
import java.util.EnumMap;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.camel.component.braintree.BraintreeConfiguration;
import org.apache.camel.component.braintree.AddOnGatewayEndpointConfiguration;
import org.apache.camel.component.braintree.AddressGatewayEndpointConfiguration;
import org.apache.camel.component.braintree.ClientTokenGatewayEndpointConfiguration;
import org.apache.camel.component.braintree.CreditCardVerificationGatewayEndpointConfiguration;
import org.apache.camel.component.braintree.CustomerGatewayEndpointConfiguration;
import org.apache.camel.component.braintree.DiscountGatewayEndpointConfiguration;
import org.apache.camel.component.braintree.DisputeGatewayEndpointConfiguration;
import org.apache.camel.component.braintree.DocumentUploadGatewayEndpointConfiguration;
import org.apache.camel.component.braintree.MerchantAccountGatewayEndpointConfiguration;
import org.apache.camel.component.braintree.PaymentMethodGatewayEndpointConfiguration;
import org.apache.camel.component.braintree.PaymentMethodNonceGatewayEndpointConfiguration;
import org.apache.camel.component.braintree.OAuthGatewayEndpointConfiguration;
import org.apache.camel.component.braintree.PlanGatewayEndpointConfiguration;
import org.apache.camel.component.braintree.ReportGatewayEndpointConfiguration;
import org.apache.camel.component.braintree.SettlementBatchSummaryGatewayEndpointConfiguration;
import org.apache.camel.component.braintree.SubscriptionGatewayEndpointConfiguration;
import org.apache.camel.component.braintree.TransactionGatewayEndpointConfiguration;
import org.apache.camel.component.braintree.UsBankAccountGatewayEndpointConfiguration;
import org.apache.camel.component.braintree.WebhookNotificationGatewayEndpointConfiguration;

import org.apache.camel.support.component.ApiCollection;
import org.apache.camel.support.component.ApiMethod;
import org.apache.camel.support.component.ApiMethodHelper;

/**
 * Camel {@link ApiCollection} for Braintree
 */
public final class BraintreeApiCollection extends ApiCollection<BraintreeApiName, BraintreeConfiguration> {

    private BraintreeApiCollection() {
        final Map<String, String> aliases = new HashMap<>();
        final Map<BraintreeApiName, ApiMethodHelper<? extends ApiMethod>> apiHelpers = new EnumMap<>(BraintreeApiName.class);
        final Map<Class<? extends ApiMethod>, BraintreeApiName> apiMethods = new HashMap<>();

        List<String> nullableArgs;

        aliases.clear();
        nullableArgs = Arrays.asList();
        apiHelpers.put(BraintreeApiName.ADD_ON, new ApiMethodHelper<>(AddOnGatewayApiMethod.class, aliases, nullableArgs));
        apiMethods.put(AddOnGatewayApiMethod.class, BraintreeApiName.ADD_ON);

        aliases.clear();
        nullableArgs = Arrays.asList();
        apiHelpers.put(BraintreeApiName.ADDRESS, new ApiMethodHelper<>(AddressGatewayApiMethod.class, aliases, nullableArgs));
        apiMethods.put(AddressGatewayApiMethod.class, BraintreeApiName.ADDRESS);

        aliases.clear();
        nullableArgs = Arrays.asList();
        apiHelpers.put(BraintreeApiName.CLIENT_TOKEN, new ApiMethodHelper<>(ClientTokenGatewayApiMethod.class, aliases, nullableArgs));
        apiMethods.put(ClientTokenGatewayApiMethod.class, BraintreeApiName.CLIENT_TOKEN);

        aliases.clear();
        nullableArgs = Arrays.asList();
        apiHelpers.put(BraintreeApiName.CREDIT_CARD_VERIFICATION, new ApiMethodHelper<>(CreditCardVerificationGatewayApiMethod.class, aliases, nullableArgs));
        apiMethods.put(CreditCardVerificationGatewayApiMethod.class, BraintreeApiName.CREDIT_CARD_VERIFICATION);

        aliases.clear();
        nullableArgs = Arrays.asList();
        apiHelpers.put(BraintreeApiName.CUSTOMER, new ApiMethodHelper<>(CustomerGatewayApiMethod.class, aliases, nullableArgs));
        apiMethods.put(CustomerGatewayApiMethod.class, BraintreeApiName.CUSTOMER);

        aliases.clear();
        nullableArgs = Arrays.asList();
        apiHelpers.put(BraintreeApiName.DISCOUNT, new ApiMethodHelper<>(DiscountGatewayApiMethod.class, aliases, nullableArgs));
        apiMethods.put(DiscountGatewayApiMethod.class, BraintreeApiName.DISCOUNT);

        aliases.clear();
        nullableArgs = Arrays.asList();
        apiHelpers.put(BraintreeApiName.DISPUTE, new ApiMethodHelper<>(DisputeGatewayApiMethod.class, aliases, nullableArgs));
        apiMethods.put(DisputeGatewayApiMethod.class, BraintreeApiName.DISPUTE);

        aliases.clear();
        nullableArgs = Arrays.asList();
        apiHelpers.put(BraintreeApiName.DOCUMENT_UPLOAD, new ApiMethodHelper<>(DocumentUploadGatewayApiMethod.class, aliases, nullableArgs));
        apiMethods.put(DocumentUploadGatewayApiMethod.class, BraintreeApiName.DOCUMENT_UPLOAD);

        aliases.clear();
        nullableArgs = Arrays.asList();
        apiHelpers.put(BraintreeApiName.MERCHANT_ACCOUNT, new ApiMethodHelper<>(MerchantAccountGatewayApiMethod.class, aliases, nullableArgs));
        apiMethods.put(MerchantAccountGatewayApiMethod.class, BraintreeApiName.MERCHANT_ACCOUNT);

        aliases.clear();
        nullableArgs = Arrays.asList();
        apiHelpers.put(BraintreeApiName.PAYMENT_METHOD, new ApiMethodHelper<>(PaymentMethodGatewayApiMethod.class, aliases, nullableArgs));
        apiMethods.put(PaymentMethodGatewayApiMethod.class, BraintreeApiName.PAYMENT_METHOD);

        aliases.clear();
        nullableArgs = Arrays.asList();
        apiHelpers.put(BraintreeApiName.PAYMENT_METHOD_NONCE, new ApiMethodHelper<>(PaymentMethodNonceGatewayApiMethod.class, aliases, nullableArgs));
        apiMethods.put(PaymentMethodNonceGatewayApiMethod.class, BraintreeApiName.PAYMENT_METHOD_NONCE);

        aliases.clear();
        nullableArgs = Arrays.asList();
        apiHelpers.put(BraintreeApiName.OAUTH, new ApiMethodHelper<>(OAuthGatewayApiMethod.class, aliases, nullableArgs));
        apiMethods.put(OAuthGatewayApiMethod.class, BraintreeApiName.OAUTH);

        aliases.clear();
        nullableArgs = Arrays.asList();
        apiHelpers.put(BraintreeApiName.PLAN, new ApiMethodHelper<>(PlanGatewayApiMethod.class, aliases, nullableArgs));
        apiMethods.put(PlanGatewayApiMethod.class, BraintreeApiName.PLAN);

        aliases.clear();
        nullableArgs = Arrays.asList();
        apiHelpers.put(BraintreeApiName.REPORT, new ApiMethodHelper<>(ReportGatewayApiMethod.class, aliases, nullableArgs));
        apiMethods.put(ReportGatewayApiMethod.class, BraintreeApiName.REPORT);

        aliases.clear();
        nullableArgs = Arrays.asList();
        apiHelpers.put(BraintreeApiName.SETTLEMENT_BATCH_SUMMARY, new ApiMethodHelper<>(SettlementBatchSummaryGatewayApiMethod.class, aliases, nullableArgs));
        apiMethods.put(SettlementBatchSummaryGatewayApiMethod.class, BraintreeApiName.SETTLEMENT_BATCH_SUMMARY);

        aliases.clear();
        nullableArgs = Arrays.asList();
        apiHelpers.put(BraintreeApiName.SUBSCRIPTION, new ApiMethodHelper<>(SubscriptionGatewayApiMethod.class, aliases, nullableArgs));
        apiMethods.put(SubscriptionGatewayApiMethod.class, BraintreeApiName.SUBSCRIPTION);

        aliases.clear();
        nullableArgs = Arrays.asList();
        apiHelpers.put(BraintreeApiName.TRANSACTION, new ApiMethodHelper<>(TransactionGatewayApiMethod.class, aliases, nullableArgs));
        apiMethods.put(TransactionGatewayApiMethod.class, BraintreeApiName.TRANSACTION);

        aliases.clear();
        nullableArgs = Arrays.asList();
        apiHelpers.put(BraintreeApiName.US_BANK_ACCOUNT, new ApiMethodHelper<>(UsBankAccountGatewayApiMethod.class, aliases, nullableArgs));
        apiMethods.put(UsBankAccountGatewayApiMethod.class, BraintreeApiName.US_BANK_ACCOUNT);

        aliases.clear();
        nullableArgs = Arrays.asList();
        apiHelpers.put(BraintreeApiName.WEBHOOK_NOTIFICATION, new ApiMethodHelper<>(WebhookNotificationGatewayApiMethod.class, aliases, nullableArgs));
        apiMethods.put(WebhookNotificationGatewayApiMethod.class, BraintreeApiName.WEBHOOK_NOTIFICATION);

        setApiHelpers(apiHelpers);
        setApiMethods(apiMethods);
    }

    public BraintreeConfiguration getEndpointConfiguration(BraintreeApiName apiName) {
        BraintreeConfiguration result = null;
        switch (apiName) {
            case ADD_ON:
                result = new AddOnGatewayEndpointConfiguration();
                break;
            case ADDRESS:
                result = new AddressGatewayEndpointConfiguration();
                break;
            case CLIENT_TOKEN:
                result = new ClientTokenGatewayEndpointConfiguration();
                break;
            case CREDIT_CARD_VERIFICATION:
                result = new CreditCardVerificationGatewayEndpointConfiguration();
                break;
            case CUSTOMER:
                result = new CustomerGatewayEndpointConfiguration();
                break;
            case DISCOUNT:
                result = new DiscountGatewayEndpointConfiguration();
                break;
            case DISPUTE:
                result = new DisputeGatewayEndpointConfiguration();
                break;
            case DOCUMENT_UPLOAD:
                result = new DocumentUploadGatewayEndpointConfiguration();
                break;
            case MERCHANT_ACCOUNT:
                result = new MerchantAccountGatewayEndpointConfiguration();
                break;
            case PAYMENT_METHOD:
                result = new PaymentMethodGatewayEndpointConfiguration();
                break;
            case PAYMENT_METHOD_NONCE:
                result = new PaymentMethodNonceGatewayEndpointConfiguration();
                break;
            case OAUTH:
                result = new OAuthGatewayEndpointConfiguration();
                break;
            case PLAN:
                result = new PlanGatewayEndpointConfiguration();
                break;
            case REPORT:
                result = new ReportGatewayEndpointConfiguration();
                break;
            case SETTLEMENT_BATCH_SUMMARY:
                result = new SettlementBatchSummaryGatewayEndpointConfiguration();
                break;
            case SUBSCRIPTION:
                result = new SubscriptionGatewayEndpointConfiguration();
                break;
            case TRANSACTION:
                result = new TransactionGatewayEndpointConfiguration();
                break;
            case US_BANK_ACCOUNT:
                result = new UsBankAccountGatewayEndpointConfiguration();
                break;
            case WEBHOOK_NOTIFICATION:
                result = new WebhookNotificationGatewayEndpointConfiguration();
                break;
        }
        return result;
    }

    public static BraintreeApiCollection getCollection() {
        return BraintreeApiCollectionHolder.INSTANCE;
    }

    private static final class BraintreeApiCollectionHolder {
        private static final BraintreeApiCollection INSTANCE = new BraintreeApiCollection();
    }
}
