/*
 * 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.sling.testing.mock.sling;

import org.jetbrains.annotations.NotNull;

/**
 * The resource resolver mock implementation supports different underlying
 * repository implementations.
 */
@SuppressWarnings("null")
public enum ResourceResolverType {

    /**
     * Uses Sling "resourceresolver-mock" implementation, no underlying JCR repository.
     * <ul>
     * <li>Simulates an In-Memory resource tree, does not provide adaptions to JCR.</li>
     * <li>You can use it to make sure the code you want to test does not contain references to JCR API.</li>
     * <li>Behaves slightly different from JCR resource mapping e.g. handling binary and date values.</li>
     * <li>This resource resolver type is very fast.</li>
     * </ul>
     */
    RESOURCERESOLVER_MOCK(RRMockMockResourceResolverAdapter.class.getName(), null, NodeTypeMode.NOT_SUPPORTED),

    /**
     * Uses Sling "resourceresolver-mock" implementation, no underlying JCR repository.
     * <ul>
     * <li>Uses the real Sling Resource Resolver and JCR Resource mapping implementation.
     *  This allows using multiple resource providers and loading folders for JSON or FileVault XML content.</li>
     * <li>Simulates an In-Memory resource tree, does not provide adaptions to JCR.</li>
     * <li>You can use it to make sure the code you want to test does not contain references to JCR API.</li>
     * <li>Behaves slightly different from JCR resource mapping e.g. handling binary and date values.</li>
     * <li>This resource resolver type is quite fast.</li>
     * </ul>
     */
    RESOURCEPROVIDER_MOCK(RPMockMockResourceResolverAdapter.class.getName(), null, NodeTypeMode.NOT_SUPPORTED),

    /**
     * Uses a simple JCR "in-memory" mock as underlying repository.
     * <ul>
     * <li>Uses the real Sling Resource Resolver and JCR Resource mapping implementation.
     *  This allows using multiple resource providers and loading folders for JSON or FileVault XML content.</li>
     * <li>The mock JCR implementation from Apache Sling is used.</li>
     * <li>It supports the most important, but not all JCR features. Extended
     * features like Versioning, Eventing, Search, Transaction handling etc. are
     * not supported.</li>
     * <li>This resource resolver type is quite fast.</li>
     * </ul>
     */
    JCR_MOCK(MockJcrResourceResolverAdapter.class.getName(), null, NodeTypeMode.NAMESPACES_ONLY),

    /**
     * Uses a real JCR Jackrabbit Oak repository.
     * <ul>
     * <li>Uses the real Sling Resource Resolver and JCR Resource mapping implementation.
     *  This allows using multiple resource providers and loading folders for JSON or FileVault XML content.</li>
     * <li>The JCR repository is started on first access, this may take some seconds.</li>
     * <li>The <code>MemoryNodeStore</code> implementation is used, with no customizations.</li>
     * </ul>
     */
    JCR_OAK("org.apache.sling.testing.mock.sling.oak.OakMockResourceResolverAdapter",
            "org.apache.sling:org.apache.sling.testing.sling-mock-oak", NodeTypeMode.NODETYPES_REQUIRED),

    /**
     * Provides resource resolver environment without any ResourceProvider.
     * You have to register one yourself to do anything useful with it.
     * <ul>
     * <li>Uses the real Sling Resource Resolver  implementation.</li>
     * <li>The performance of this resource resolver type depends on the resource provider registered.</li>
     * </ul>
     */
    NONE(MockNoneResourceResolverAdapter.class.getName(), null, NodeTypeMode.NOT_SUPPORTED);


    private final @NotNull String resourceResolverTypeAdapterClass;
    private final @NotNull String artifactCoordinates;
    private final @NotNull NodeTypeMode nodeTypeMode;


    private ResourceResolverType(@NotNull final String resourceResolverTypeAdapterClass,
            @NotNull final String artifactCoordinates,
            @NotNull final NodeTypeMode nodeTypeMode) {
        this.resourceResolverTypeAdapterClass = resourceResolverTypeAdapterClass;
        this.artifactCoordinates = artifactCoordinates;
        this.nodeTypeMode = nodeTypeMode;
    }

    @NotNull String getResourceResolverTypeAdapterClass() {
        return this.resourceResolverTypeAdapterClass;
    }

    @NotNull String getArtifactCoordinates() {
        return this.artifactCoordinates;
    }

    /**
     * @return How JCR namespaces and node types have to be handled.
     */
    public @NotNull NodeTypeMode getNodeTypeMode() {
        return nodeTypeMode;
    }

}
