/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License 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 org.apache.camel.component.fhir;

import java.util.HashMap;
import java.util.Map;

import ca.uhn.fhir.rest.client.api.IGenericClient;
import org.apache.camel.Consumer;
import org.apache.camel.Processor;
import org.apache.camel.Producer;
import org.apache.camel.component.fhir.api.ExtraParameters;
import org.apache.camel.component.fhir.api.FhirCapabilities;
import org.apache.camel.component.fhir.api.FhirCreate;
import org.apache.camel.component.fhir.api.FhirDelete;
import org.apache.camel.component.fhir.api.FhirHistory;
import org.apache.camel.component.fhir.api.FhirLoadPage;
import org.apache.camel.component.fhir.api.FhirMeta;
import org.apache.camel.component.fhir.api.FhirOperation;
import org.apache.camel.component.fhir.api.FhirPatch;
import org.apache.camel.component.fhir.api.FhirRead;
import org.apache.camel.component.fhir.api.FhirSearch;
import org.apache.camel.component.fhir.api.FhirTransaction;
import org.apache.camel.component.fhir.api.FhirUpdate;
import org.apache.camel.component.fhir.api.FhirValidate;
import org.apache.camel.component.fhir.internal.FhirApiCollection;
import org.apache.camel.component.fhir.internal.FhirApiName;
import org.apache.camel.component.fhir.internal.FhirConstants;
import org.apache.camel.component.fhir.internal.FhirPropertiesHelper;
import org.apache.camel.spi.UriEndpoint;
import org.apache.camel.spi.UriParam;
import org.apache.camel.support.component.AbstractApiEndpoint;
import org.apache.camel.support.component.ApiMethod;
import org.apache.camel.support.component.ApiMethodPropertiesHelper;

/**
 * The fhir component is used for working with the FHIR protocol (health care).
 */
@UriEndpoint(firstVersion = "2.23.0", scheme = "fhir", title = "FHIR", syntax = "fhir:apiName/methodName",
        label = "hl7,api")
public class FhirEndpoint extends AbstractApiEndpoint<FhirApiName, FhirConfiguration> {

    private static final String EXTRA_PARAMETERS_PROPERTY = "extraParameters";

    private Object apiProxy;

    @UriParam
    private FhirConfiguration configuration;

    public FhirEndpoint(String uri, FhirComponent component,
                        FhirApiName apiName, String methodName, FhirConfiguration endpointConfiguration) {
        super(uri, component, apiName, methodName, FhirApiCollection.getCollection().getHelper(apiName), endpointConfiguration);
        this.configuration = endpointConfiguration;
    }

    @Override
    public Producer createProducer() throws Exception {
        return new FhirProducer(this);
    }

    @Override
    public Consumer createConsumer(Processor processor) throws Exception {
        // make sure inBody is not set for consumers
        if (inBody != null) {
            throw new IllegalArgumentException("Option inBody is not supported for consumer endpoint");
        }
        final FhirConsumer consumer = new FhirConsumer(this, processor);
        // also set consumer.* properties
        configureConsumer(consumer);
        return consumer;
    }

    @Override
    protected ApiMethodPropertiesHelper<FhirConfiguration> getPropertiesHelper() {
        return FhirPropertiesHelper.getHelper();
    }

    @Override
    protected String getThreadProfileName() {
        return FhirConstants.THREAD_PROFILE_NAME;
    }

    @Override
    protected void afterConfigureProperties() {
        IGenericClient client = getClient();
        switch (apiName) {
        case CAPABILITIES:
            apiProxy = new FhirCapabilities(client);
            break;
        case CREATE:
            apiProxy = new FhirCreate(client);
            break;
        case DELETE:
            apiProxy = new FhirDelete(client);
            break;
        case HISTORY:
            apiProxy = new FhirHistory(client);
            break;
        case LOAD_PAGE:
            apiProxy = new FhirLoadPage(client);
            break;
        case META:
            apiProxy = new FhirMeta(client);
            break;
        case OPERATION:
            apiProxy = new FhirOperation(client);
            break;
        case PATCH:
            apiProxy = new FhirPatch(client);
            break;
        case READ:
            apiProxy = new FhirRead(client);
            break;
        case SEARCH:
            apiProxy = new FhirSearch(client);
            break;
        case TRANSACTION:
            apiProxy = new FhirTransaction(client);
            break;
        case UPDATE:
            apiProxy = new FhirUpdate(client);
            break;
        case VALIDATE:
            apiProxy = new FhirValidate(client);
            break;
        default:
            throw new IllegalArgumentException("Invalid API name " + apiName);
        }
    }

    @Override
    public void interceptProperties(Map<String, Object> properties) {
        Map<ExtraParameters, Object> extraProperties = getExtraParameters(properties);
        for (ExtraParameters extraParameter : ExtraParameters.values()) {
            Object value = properties.get(extraParameter.getParam());
            if (value != null) {
                extraProperties.put(extraParameter, value);
            }
        }
        properties.put(EXTRA_PARAMETERS_PROPERTY, extraProperties);

    }

    IGenericClient getClient() {
        return ((FhirComponent) getComponent()).getClient(configuration);
    }

    private Map<ExtraParameters, Object> getExtraParameters(Map<String, Object> properties) {
        Object extraParameters = properties.get(EXTRA_PARAMETERS_PROPERTY);
        if (extraParameters == null) {
            return new HashMap<>();
        }
        return (Map<ExtraParameters, Object>) extraParameters;
    }

    @Override
    public Object getApiProxy(ApiMethod method, Map<String, Object> args) {
        return apiProxy;
    }
}
