/*
 * Copyright 2014 The Apache Software Foundation.
 *
 * Licensed 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.usergrid.corepersistence;

import java.util.Map;
import java.util.UUID;
import org.apache.usergrid.persistence.EntityManager;
import org.apache.usergrid.persistence.EntityManagerFactory;
import org.apache.usergrid.persistence.cassandra.CassandraService;
import org.apache.usergrid.persistence.cassandra.CounterUtils;
import org.apache.usergrid.persistence.cassandra.EntityManagerFactoryImpl;
import org.apache.usergrid.persistence.core.util.Health;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;


/**
 * Can read from either old EntityManagerImpl or new CpEntityManager, can write to either or both.
 */
public class HybridEntityManagerFactory implements EntityManagerFactory, ApplicationContextAware {
    private static final Logger logger = LoggerFactory.getLogger( CpEntityManagerFactory.class );
    private final EntityManagerFactory factory;


    public HybridEntityManagerFactory( 
            CassandraService cass, CounterUtils counterUtils, boolean skipAggCounters ) {

        boolean useCP = cass.getPropertiesMap().get("usergrid.persistence").equals("CP");
        if ( useCP ) {
            logger.info("HybridEntityManagerFactory: configured for New Core Persistence engine");
            factory = new CpEntityManagerFactory(cass, counterUtils );
        } else {
            logger.info("HybridEntityManagerFactory: configured for Classic Usergrid persistence");
            factory = new EntityManagerFactoryImpl( cass, counterUtils, skipAggCounters );
        }
    }

    @Override
    public String getImpementationDescription() throws Exception {
        return factory.getImpementationDescription();
    }

    @Override
    public EntityManager getEntityManager(UUID applicationId) {
        return factory.getEntityManager(applicationId);
    }

    @Override
    public UUID createApplication(String organizationName, String name) throws Exception {
        return factory.createApplication(organizationName, name);
    }

    @Override
    public UUID createApplication(String organizationName, String name, 
            Map<String, Object> properties) throws Exception {
        return factory.createApplication(organizationName, name, properties);
    }

    @Override
    public UUID importApplication(String organization, UUID applicationId, String name, 
            Map<String, Object> properties) throws Exception {
        return factory.importApplication(organization, applicationId, name, properties);
    }

    @Override
    public UUID lookupApplication(String name) throws Exception {
        return factory.lookupApplication(name);
    }

    @Override
    public Map<String, UUID> getApplications() throws Exception {
        return factory.getApplications();
    }

    @Override
    public void setup() throws Exception {
        factory.setup();
    }

    @Override
    public Map<String, String> getServiceProperties() {
        return factory.getServiceProperties();
    }

    @Override
    public boolean updateServiceProperties(Map<String, String> properties) {
        return factory.updateServiceProperties(properties);
    }

    @Override
    public boolean setServiceProperty(String name, String value) {
        return factory.setServiceProperty(name, value);
    }

    @Override
    public boolean deleteServiceProperty(String name) {
        return factory.deleteServiceProperty(name);
    }

    @Override
    public UUID initializeApplication(String orgName, UUID appId, String appName, 
            Map<String, Object> props) throws Exception {
        return factory.initializeApplication(orgName, appId, appName, props);
    }

    @Override
    public UUID getManagementAppId() {
        return factory.getManagementAppId();
    }

    @Override
    public UUID getDefaultAppId() {
        return factory.getDefaultAppId();
    }

    @Override
    public void refreshIndex() {
        factory.refreshIndex();
    }

    @Override
    public void setApplicationContext(ApplicationContext ac) throws BeansException {
        factory.setApplicationContext(ac);
    }


    @Override
    public long performEntityCount() {
        return factory.performEntityCount();
    }


    @Override
    public void flushEntityManagerCaches() {
        factory.flushEntityManagerCaches();
    }

    @Override
    public void rebuildInternalIndexes(ProgressObserver po) throws Exception {
        factory.rebuildInternalIndexes(po);
    }

    @Override
    public void rebuildAllIndexes(ProgressObserver po) throws Exception {
        factory.rebuildAllIndexes(po);
    }

    @Override
    public void rebuildApplicationIndexes(UUID appId, ProgressObserver po) throws Exception {
        factory.rebuildApplicationIndexes(appId, po);
    }


    @Override
    public void migrateData() throws Exception {
        factory.migrateData();
    }


    @Override
    public String getMigrateDataStatus() {
        return factory.getMigrateDataStatus();
    }


    @Override
    public int getMigrateDataVersion() {
        return factory.getMigrateDataVersion();
    }


    @Override
    public void setMigrationVersion( final int version ) {
        factory.setMigrationVersion( version );
    }


    @Override
    public void rebuildCollectionIndex(UUID appId, String collection, ProgressObserver po) {
        factory.rebuildCollectionIndex(appId, collection, po);
    }

    @Override
    public Health getEntityStoreHealth() {
        return factory.getEntityStoreHealth();
    }
}
