/*
 * 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.cdc.conflictresolve;

import java.io.Serializable;
import java.util.Set;
import java.util.UUID;
import org.apache.ignite.cluster.ClusterNode;
import org.apache.ignite.internal.IgniteEx;
import org.apache.ignite.internal.processors.cache.version.CacheVersionConflictResolver;
import org.apache.ignite.plugin.CachePluginContext;
import org.apache.ignite.plugin.CachePluginProvider;
import org.apache.ignite.plugin.ExtensionRegistry;
import org.apache.ignite.plugin.IgnitePlugin;
import org.apache.ignite.plugin.PluginConfiguration;
import org.apache.ignite.plugin.PluginContext;
import org.apache.ignite.plugin.PluginProvider;
import org.apache.ignite.plugin.PluginValidationException;
import org.jetbrains.annotations.Nullable;

/**
 * Plugin to enable {@link CacheVersionConflictResolverImpl} for provided caches.
 *
 * @see CacheVersionConflictResolverImpl
 * @see CacheVersionConflictResolver
 */
public class CacheVersionConflictResolverPluginProvider<C extends PluginConfiguration> implements PluginProvider<C> {
    /** Plugin context. */
    private PluginContext ctx;

    /** Cluster id. */
    private byte clusterId;

    /** Cache names. */
    private Set<String> caches;

    /**
     * Field for conflict resolve.
     * Value of this field will be used to compare two entries in case of conflicting changes.
     * Note, values of this field must implement {@link Comparable}.
     *
     * @see CacheVersionConflictResolverImpl
     */
    private String conflictResolveField;

    /** Cache plugin provider. */
    private CachePluginProvider<?> provider;

    /** */
    public CacheVersionConflictResolverPluginProvider() {
        // No-op.
    }

    /** {@inheritDoc} */
    @Override public String name() {
        return "Cache version conflict resolver";
    }

    /** {@inheritDoc} */
    @Override public String version() {
        return "1.0.0-SNAPSHOT";
    }

    /** {@inheritDoc} */
    @Override public String copyright() {
        return "Apache Software Foundation";
    }

    /** {@inheritDoc} */
    @Override public void initExtensions(PluginContext ctx, ExtensionRegistry registry) {
        this.ctx = ctx;

        this.provider = new CacheVersionConflictResolverCachePluginProvider<>(conflictResolveField);
    }

    /** {@inheritDoc} */
    @Override public CachePluginProvider createCacheProvider(CachePluginContext ctx) {
        if (caches.contains(ctx.igniteCacheConfiguration().getName()))
            return provider;

        return null;
    }

    /** {@inheritDoc} */
    @Override public void onIgniteStart() {
        IgniteEx ign = (IgniteEx)ctx.grid();

        ign.context().cache().context().versions().dataCenterId(clusterId);
    }

    /** {@inheritDoc} */
    @Override public IgnitePlugin plugin() {
        return new IgnitePlugin() { /* No-op. */ };
    }

    /** @param clusterId Data center ID. */
    public void setClusterId(byte clusterId) {
        this.clusterId = clusterId;
    }

    /** @param caches Caches to replicate. */
    public void setCaches(Set<String> caches) {
        this.caches = caches;
    }

    /** @param conflictResolveField Field to resolve conflicts. */
    public void setConflictResolveField(String conflictResolveField) {
        this.conflictResolveField = conflictResolveField;
    }

    /** {@inheritDoc} */
    @Override public void start(PluginContext ctx) {
        // No-op.
    }

    /** {@inheritDoc} */
    @Override public void stop(boolean cancel) {
        // No-op.
    }

    /** {@inheritDoc} */
    @Override public void onIgniteStop(boolean cancel) {
        // No-op.
    }

    /** {@inheritDoc} */
    @Override public @Nullable Serializable provideDiscoveryData(UUID nodeId) {
        return null;
    }

    /** {@inheritDoc} */
    @Override public void receiveDiscoveryData(UUID nodeId, Serializable data) {
        // No-op.
    }

    /** {@inheritDoc} */
    @Override public void validateNewNode(ClusterNode node) throws PluginValidationException {
        // No-op.
    }

    /** {@inheritDoc} */
    @Nullable public <T> T createComponent(PluginContext ctx, Class<T> cls) {
        return null;
    }
}
