/*
 * 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.qi4j.entitystore.file;

import org.qi4j.api.common.Optional;
import org.qi4j.api.configuration.ConfigurationComposite;
import org.qi4j.api.property.Property;
import org.qi4j.library.constraints.annotation.Range;

/**
 * Configuration for the FileEntityStoreService
 */
// START SNIPPET: config
public interface FileEntityStoreConfiguration
    extends ConfigurationComposite
{
    // END SNIPPET: config
    /**
     * The directory where the File Entity Store will be keep its persisted state.
     * <p>
     *     If no configuration is provided at all, then the default location is
     *     {@code System.getProperty( "user.dir" ) + "/qi4j/filestore"; }.
     *     If a configuration is given, the entity store will be placed in the
     *     DATA directory, which is operating system specific.
     * </p>
     * <table summary="Default locations">
     *     <tr><th>OS</th><th>Location</th></tr>
     *     <tr><td>Linux/Unix</td><td>{user}/.{application}/data</td></tr>
     *     <tr><td>OSX</td><td>{user}/Library/Application Support/{application}</td></tr>
     *     <tr><td>Windows</td><td>{user}/Application Data/{application}/data</td></tr>
     * </table>
     * <pre><code>
     * where;
     *   {user} = Current User's home directory
     *   {application} = Application's name, as set in assembly.
     * </code></pre>
     * <p>
     * Ignored if the FileConfiguration service is found.
     * </p>
     * <p>
     * The content inside this directory should not be modified directly, and doing so may corrupt the data.
     * </p>
     *
     * @return path to data file relative to current path
     */
    // START SNIPPET: config
    @Optional
    Property<String> directory();
    // END SNIPPET: config

    /** Defines how many slice directories the store should use.
     * <p>
     * Many operating systems run into performance problems when the number of files in a directory grows. If
     * you expect a large number of entities in the file entity store, it is wise to set the number of slices
     * (default is 1) to an approximation of the square root of number of expected entities.
     * </p>
     * <p>
     * For instance, if you estimate that you will have 1 million entities in the file entity store, you should
     * set the slices to 1000.
     * </p>
     * <p>
     * There is an limit of minimum 1 slice and maximum 10,000 slices, and if more slices than that is needed, you
     * are probably pushing this entitystore beyond its capabilities.
     * </p>
     * <p>
     * Note that the slices() can not be changed once it has been set, as it would cause the entity store not to
     * find the entities anymore.
     * </p>
     * @return the number of slices for the file entity store.
     */
    // START SNIPPET: config
    @Optional @Range(min=1, max=10000)
    Property<Integer> slices();
}
// END SNIPPET: config
