/*
 * 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 org.apache.usergrid.corepersistence.index.IndexLocationStrategyFactory;
import org.apache.usergrid.persistence.collection.EntityCollectionManager;
import org.apache.usergrid.persistence.collection.EntityCollectionManagerFactory;
import org.apache.usergrid.persistence.core.scope.ApplicationScope;
import org.apache.usergrid.persistence.graph.GraphManager;
import org.apache.usergrid.persistence.graph.GraphManagerFactory;
import org.apache.usergrid.persistence.index.EntityIndex;
import org.apache.usergrid.persistence.index.EntityIndexFactory;
import org.apache.usergrid.persistence.index.IndexLocationStrategy;
import org.apache.usergrid.persistence.index.impl.IndexProducer;
import org.apache.usergrid.persistence.map.MapManager;
import org.apache.usergrid.persistence.map.MapManagerFactory;
import org.apache.usergrid.persistence.map.MapScope;

import com.google.inject.Inject;


/**
 * Cache for managing our other managers.  Now just a delegate.  Needs refactored away
 */

public class CpManagerCache implements ManagerCache {

    private final EntityCollectionManagerFactory ecmf;
    private final EntityIndexFactory eif;
    private final GraphManagerFactory gmf;
    private final MapManagerFactory mmf;
    private final IndexLocationStrategyFactory indexLocationStrategyFactory;
    private final IndexProducer indexProducer;

    // TODO: consider making these cache sizes and timeouts configurable


    @Inject
    public CpManagerCache( final EntityCollectionManagerFactory ecmf,
                           final EntityIndexFactory eif,
                           final GraphManagerFactory gmf,
                           final MapManagerFactory mmf,
                           final IndexLocationStrategyFactory indexLocationStrategyFactory,
                           final IndexProducer indexProducer
    ) {

        this.ecmf = ecmf;
        this.eif = eif;
        this.gmf = gmf;
        this.mmf = mmf;
        this.indexLocationStrategyFactory = indexLocationStrategyFactory;
        this.indexProducer = indexProducer;
    }


    @Override
    public EntityCollectionManager getEntityCollectionManager( ApplicationScope scope ) {
        //cache is now in the colletion manager level
        return ecmf.createCollectionManager( scope );
    }


    @Override
    public EntityIndex getEntityIndex( ApplicationScope applicationScope) {
        IndexLocationStrategy indexLocationStrategy
            = indexLocationStrategyFactory.getIndexLocationStrategy(applicationScope);
        return eif.createEntityIndex( indexLocationStrategy );
    }


    @Override
    public GraphManager getGraphManager( ApplicationScope appScope ) {
        return gmf.createEdgeManager( appScope );
    }


    @Override
    public MapManager getMapManager( MapScope mapScope ) {
        return mmf.createMapManager( mapScope );
    }

    @Override
    public IndexProducer getIndexProducer() {
        return indexProducer;
    }


    @Override
    public void invalidate() {
        ecmf.invalidate();
        eif.invalidate();
        gmf.invalidate();
        mmf.invalidate();
    }
}
