/*
 * 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.ignite.internal.processors.cache.persistence.wal.reader;

import java.io.File;
import java.lang.reflect.Field;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ExecutorService;
import org.apache.ignite.IgniteCheckedException;
import org.apache.ignite.IgniteLogger;
import org.apache.ignite.configuration.DataRegionConfiguration;
import org.apache.ignite.configuration.DataStorageConfiguration;
import org.apache.ignite.configuration.IgniteConfiguration;
import org.apache.ignite.internal.GridComponent;
import org.apache.ignite.internal.GridKernalContext;
import org.apache.ignite.internal.GridKernalGateway;
import org.apache.ignite.internal.IgniteEx;
import org.apache.ignite.internal.IgniteKernal;
import org.apache.ignite.internal.MarshallerContextImpl;
import org.apache.ignite.internal.binary.BinaryMarshaller;
import org.apache.ignite.internal.managers.checkpoint.GridCheckpointManager;
import org.apache.ignite.internal.managers.collision.GridCollisionManager;
import org.apache.ignite.internal.managers.communication.GridIoManager;
import org.apache.ignite.internal.managers.deployment.GridDeploymentManager;
import org.apache.ignite.internal.managers.discovery.GridDiscoveryManager;
import org.apache.ignite.internal.managers.encryption.GridEncryptionManager;
import org.apache.ignite.internal.managers.eventstorage.GridEventStorageManager;
import org.apache.ignite.internal.managers.failover.GridFailoverManager;
import org.apache.ignite.internal.managers.indexing.GridIndexingManager;
import org.apache.ignite.internal.managers.loadbalancer.GridLoadBalancerManager;
import org.apache.ignite.internal.processors.affinity.GridAffinityProcessor;
import org.apache.ignite.internal.processors.authentication.IgniteAuthenticationProcessor;
import org.apache.ignite.internal.processors.cache.GridCacheProcessor;
import org.apache.ignite.internal.processors.cache.binary.CacheObjectBinaryProcessorImpl;
import org.apache.ignite.internal.processors.cache.mvcc.MvccProcessor;
import org.apache.ignite.internal.processors.cache.persistence.filename.PdsFolderSettings;
import org.apache.ignite.internal.processors.cache.persistence.filename.PdsFoldersResolver;
import org.apache.ignite.internal.processors.cacheobject.IgniteCacheObjectProcessor;
import org.apache.ignite.internal.processors.closure.GridClosureProcessor;
import org.apache.ignite.internal.processors.cluster.ClusterProcessor;
import org.apache.ignite.internal.processors.cluster.GridClusterStateProcessor;
import org.apache.ignite.internal.processors.continuous.GridContinuousProcessor;
import org.apache.ignite.internal.processors.datastreamer.DataStreamProcessor;
import org.apache.ignite.internal.processors.datastructures.DataStructuresProcessor;
import org.apache.ignite.internal.processors.failure.FailureProcessor;
import org.apache.ignite.internal.processors.hadoop.HadoopHelper;
import org.apache.ignite.internal.processors.hadoop.HadoopProcessorAdapter;
import org.apache.ignite.internal.processors.igfs.IgfsHelper;
import org.apache.ignite.internal.processors.igfs.IgfsProcessorAdapter;
import org.apache.ignite.internal.processors.job.GridJobProcessor;
import org.apache.ignite.internal.processors.jobmetrics.GridJobMetricsProcessor;
import org.apache.ignite.internal.processors.marshaller.GridMarshallerMappingProcessor;
import org.apache.ignite.internal.processors.odbc.ClientListenerProcessor;
import org.apache.ignite.internal.processors.platform.PlatformProcessor;
import org.apache.ignite.internal.processors.plugin.IgnitePluginProcessor;
import org.apache.ignite.internal.processors.pool.PoolProcessor;
import org.apache.ignite.internal.processors.port.GridPortProcessor;
import org.apache.ignite.internal.processors.query.GridQueryProcessor;
import org.apache.ignite.internal.processors.resource.GridResourceProcessor;
import org.apache.ignite.internal.processors.rest.GridRestProcessor;
import org.apache.ignite.internal.processors.schedule.IgniteScheduleProcessorAdapter;
import org.apache.ignite.internal.processors.security.GridSecurityProcessor;
import org.apache.ignite.internal.processors.segmentation.GridSegmentationProcessor;
import org.apache.ignite.internal.processors.service.GridServiceProcessor;
import org.apache.ignite.internal.processors.session.GridTaskSessionProcessor;
import org.apache.ignite.internal.processors.subscription.GridInternalSubscriptionProcessor;
import org.apache.ignite.internal.processors.task.GridTaskProcessor;
import org.apache.ignite.internal.processors.timeout.GridTimeoutProcessor;
import org.apache.ignite.internal.suggestions.GridPerformanceSuggestions;
import org.apache.ignite.internal.util.IgniteExceptionRegistry;
import org.apache.ignite.internal.util.StripedExecutor;
import org.apache.ignite.internal.util.typedef.internal.U;
import org.apache.ignite.internal.worker.WorkersRegistry;
import org.apache.ignite.marshaller.Marshaller;
import org.apache.ignite.plugin.PluginNotFoundException;
import org.apache.ignite.plugin.PluginProvider;
import org.apache.ignite.thread.IgniteStripedThreadPoolExecutor;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

/**
 * Dummy grid kernal context
 */
public class StandaloneGridKernalContext implements GridKernalContext {
    /** Binary metadata file store folder. */
    public static final String BINARY_META_FOLDER = "binary_meta";

    /** Config for fake Ignite instance. */
    private final IgniteConfiguration cfg;

    /** Logger. */
    private IgniteLogger log;

    /** Empty plugin processor. */
    private IgnitePluginProcessor pluginProc;

    /**
     * Cache object processor. Used for converting cache objects and keys into binary objects. Null means there is no
     * convert is configured. All entries in this case will be lazy data entries.
     */
    @Nullable private IgniteCacheObjectProcessor cacheObjProcessor;

    /** Marshaller context implementation. */
    private MarshallerContextImpl marshallerCtx;

    /**
     * @param log Logger.
     * @param binaryMetadataFileStoreDir folder specifying location of metadata File Store.
     * {@code null} means no specific folder is configured. <br>
     *
     * @param marshallerMappingFileStoreDir folder specifying location of marshaller mapping file store.
     * {@code null} means no specific folder is configured.
     * Providing {@code null} will disable unmarshall for non primitive objects, BinaryObjects will be provided <br>
     */
    public StandaloneGridKernalContext(
        IgniteLogger log,
        @Nullable File binaryMetadataFileStoreDir,
        @Nullable File marshallerMappingFileStoreDir
    ) throws IgniteCheckedException {
        this.log = log;

        try {
            pluginProc = new StandaloneIgnitePluginProcessor(this, config());
        }
        catch (IgniteCheckedException e) {
            throw new IllegalStateException("Must not fail on empty providers list.", e);
        }

        this.marshallerCtx = new MarshallerContextImpl(null, null);
        this.cfg = prepareIgniteConfiguration();

        // Fake folder provided to perform processor startup on empty folder.
        if (binaryMetadataFileStoreDir == null)
            binaryMetadataFileStoreDir = new File(BINARY_META_FOLDER).getAbsoluteFile();

        this.cacheObjProcessor = binaryProcessor(this, binaryMetadataFileStoreDir);

        if (marshallerMappingFileStoreDir != null) {
            marshallerCtx.setMarshallerMappingFileStoreDir(marshallerMappingFileStoreDir);
            marshallerCtx.onMarshallerProcessorStarted(this, null);
        }
    }

    /**
     * Creates binary processor which allows to convert WAL records into objects
     *
     * @param ctx kernal context
     * @param binaryMetadataFileStoreDir folder specifying location of metadata File Store
     *
     * {@code null} means no specific folder is configured. <br> In this case folder for metadata is composed from work
     * directory and consistentId
     * @return Cache object processor able to restore data records content into binary objects
     * @throws IgniteCheckedException Throws in case of initialization errors.
     */
    private IgniteCacheObjectProcessor binaryProcessor(
        final GridKernalContext ctx,
        final File binaryMetadataFileStoreDir) throws IgniteCheckedException {

        final CacheObjectBinaryProcessorImpl processor = new CacheObjectBinaryProcessorImpl(ctx);
        processor.setBinaryMetadataFileStoreDir(binaryMetadataFileStoreDir);
        processor.start();
        return processor;
    }

    /**
     * @return Ignite configuration which allows to start requied processors for WAL reader
     */
    protected IgniteConfiguration prepareIgniteConfiguration() {
        IgniteConfiguration cfg = new IgniteConfiguration();

        cfg.setDiscoverySpi(new StandaloneNoopDiscoverySpi());
        cfg.setCommunicationSpi(new StandaloneNoopCommunicationSpi());

        final Marshaller marshaller = new BinaryMarshaller();
        cfg.setMarshaller(marshaller);

        final DataStorageConfiguration pstCfg = new DataStorageConfiguration();
        final DataRegionConfiguration regCfg = new DataRegionConfiguration();
        regCfg.setPersistenceEnabled(true);
        pstCfg.setDefaultDataRegionConfiguration(regCfg);

        cfg.setDataStorageConfiguration(pstCfg);

        marshaller.setContext(marshallerCtx);

        return cfg;
    }

    /** {@inheritDoc} */
    @Override public List<GridComponent> components() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public UUID localNodeId() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public String igniteInstanceName() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public IgniteLogger log(String ctgr) {
        return log;
    }

    /** {@inheritDoc} */
    @Override public IgniteLogger log(Class<?> cls) {
        return log;
    }

    /** {@inheritDoc} */
    @Override public boolean isStopping() {
        return false;
    }

    /** {@inheritDoc} */
    @Override public GridKernalGateway gateway() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public IgniteEx grid() {
        final IgniteEx kernal = new IgniteKernal();
        try {
            Field fieldCfg = kernal.getClass().getDeclaredField("cfg");
            fieldCfg.setAccessible(true);
            fieldCfg.set(kernal, cfg);
        }
        catch (NoSuchFieldException | IllegalAccessException e) {
            log.error("", e);
        }
        return kernal;
    }

    /** {@inheritDoc} */
    @Override public IgniteConfiguration config() {
        return cfg;
    }

    /** {@inheritDoc} */
    @Override public GridTaskProcessor task() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public GridAffinityProcessor affinity() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public GridJobProcessor job() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public GridTimeoutProcessor timeout() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public GridResourceProcessor resource() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public GridJobMetricsProcessor jobMetric() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public GridCacheProcessor cache() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public GridClusterStateProcessor state() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public GridTaskSessionProcessor session() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public GridClosureProcessor closure() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public GridServiceProcessor service() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public GridPortProcessor ports() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public IgniteScheduleProcessorAdapter schedule() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public GridRestProcessor rest() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public GridSegmentationProcessor segmentation() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public <K, V> DataStreamProcessor<K, V> dataStream() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public IgniteAuthenticationProcessor authentication() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public IgfsProcessorAdapter igfs() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public IgfsHelper igfsHelper() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public GridContinuousProcessor continuous() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public HadoopProcessorAdapter hadoop() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public PoolProcessor pools() {
        return new PoolProcessor(this);
    }

    /** {@inheritDoc} */
    @Override public GridMarshallerMappingProcessor mapping() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public HadoopHelper hadoopHelper() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public ExecutorService utilityCachePool() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public IgniteStripedThreadPoolExecutor asyncCallbackPool() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public IgniteCacheObjectProcessor cacheObjects() {
        return cacheObjProcessor;
    }

    /** {@inheritDoc} */
    @Override public GridQueryProcessor query() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public ClientListenerProcessor sqlListener() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public IgnitePluginProcessor plugins() {
        return pluginProc;
    }

    /** {@inheritDoc} */
    @Override public GridDeploymentManager deploy() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public GridIoManager io() {
        return new GridIoManager(this);
    }

    /** {@inheritDoc} */
    @Override public GridDiscoveryManager discovery() {
        return new GridDiscoveryManager(this);
    }

    /** {@inheritDoc} */
    @Override public GridCheckpointManager checkpoint() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public GridEventStorageManager event() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public GridFailoverManager failover() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public GridCollisionManager collision() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public GridSecurityProcessor security() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public GridLoadBalancerManager loadBalancing() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public GridIndexingManager indexing() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public GridEncryptionManager encryption() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public WorkersRegistry workersRegistry() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public DataStructuresProcessor dataStructures() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public MvccProcessor coordinators() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public boolean invalid() {
        return false;
    }

    /** {@inheritDoc} */
    @Override public boolean segmented() {
        return false;
    }

    /** {@inheritDoc} */
    @Override public FailureProcessor failure() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public void printMemoryStats() {
    }

    /** {@inheritDoc} */
    @Override public boolean isDaemon() {
        return false;
    }

    /** {@inheritDoc} */
    @Override public GridPerformanceSuggestions performance() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public String userVersion(ClassLoader ldr) {
        return null;
    }

    /** {@inheritDoc} */
    @Override public PluginProvider pluginProvider(String name) throws PluginNotFoundException {
        return null;
    }

    /** {@inheritDoc} */
    @Override public <T> T createComponent(Class<T> cls) {
        return null;
    }

    /** {@inheritDoc} */
    @Override public ExecutorService getExecutorService() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public ExecutorService getServiceExecutorService() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public ExecutorService getSystemExecutorService() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public StripedExecutor getStripedExecutorService() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public ExecutorService getManagementExecutorService() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public ExecutorService getPeerClassLoadingExecutorService() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public ExecutorService getIgfsExecutorService() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public StripedExecutor getDataStreamerExecutorService() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public ExecutorService getRestExecutorService() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public ExecutorService getAffinityExecutorService() {
        return null;
    }

    /** {@inheritDoc} */
    @Nullable @Override public ExecutorService getIndexingExecutorService() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public ExecutorService getQueryExecutorService() {
        return null;
    }

    /** {@inheritDoc} */
    @Nullable @Override public Map<String, ? extends ExecutorService> customExecutors() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public ExecutorService getSchemaExecutorService() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public IgniteExceptionRegistry exceptionRegistry() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public Object nodeAttribute(String key) {
        return null;
    }

    /** {@inheritDoc} */
    @Override public boolean hasNodeAttribute(String key) {
        return false;
    }

    /** {@inheritDoc} */
    @Override public Object addNodeAttribute(String key, Object val) {
        return null;
    }

    /** {@inheritDoc} */
    @Override public Map<String, Object> nodeAttributes() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public ClusterProcessor cluster() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public MarshallerContextImpl marshallerContext() {
        return marshallerCtx;
    }

    /** {@inheritDoc} */
    @Override public boolean clientNode() {
        return false;
    }

    /** {@inheritDoc} */
    @Override public boolean clientDisconnected() {
        return false;
    }

    /** {@inheritDoc} */
    @Override public PlatformProcessor platform() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public GridInternalSubscriptionProcessor internalSubscriptionProcessor() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public Thread.UncaughtExceptionHandler uncaughtExceptionHandler() {
        return null;
    }

    /** {@inheritDoc} */
    @Override public PdsFoldersResolver pdsFolderResolver() {
        return new PdsFoldersResolver() {
            /** {@inheritDoc} */
            @Override public PdsFolderSettings resolveFolders() {
                return new PdsFolderSettings(new File("."), U.maskForFileName(""));
            }
        };
    }

    /** {@inheritDoc} */
    @NotNull @Override public Iterator<GridComponent> iterator() {
        return null;
    }
}
