/*
 * 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.jena.tdb2.params;

import java.util.Objects;

import org.apache.jena.dboe.base.block.FileMode;
import org.apache.jena.dboe.index.IndexParams;
import org.apache.jena.tdb2.params.StoreParamsBuilder.Item;

/** System parameters for a TDB database instance.
 * <p>
 * Some parameters can be changed from run to run
 * and some parameters can only be changed at the point the database is
 * created.
 * <p>
 * Getting paramters settings wrong can destroy a databse.
 * Alternating the block size is not encouraged and should only be
 * done if necessary.  It can silently destroy a database if set
 * to a different value than thatused to create the database.  The
 * default value of 8Kbytes is good for almost use.
 *
 * @see StoreParamsBuilder  for constructing StoreParams
 * @see StoreParamsConst    for default values.
 */
public class StoreParams implements IndexParams, StoreParamsDynamic
{
    /* These are items you can change JVM to JVM */

    /*package*/ final Item<FileMode>           fileMode;
    /*package*/ final Item<Integer>            blockSize;
    /*package*/ final Item<Integer>            blockReadCacheSize;
    /*package*/ final Item<Integer>            blockWriteCacheSize;
    /*package*/ final Item<Integer>            Node2NodeIdCacheSize;
    /*package*/ final Item<Integer>            NodeId2NodeCacheSize;
    /*package*/ final Item<Integer>            NodeMissCacheSize;

    /* These are items affect database layout and
     * only can be applied when a database is created.
     * They do not affect existing databases.
     * If you want to, say, change the index structure,
     * you'll need to use the index tools.
     */

    /*package*/ final Item<String>             nodeTableBaseName;

    /*package*/ final Item<String>             primaryIndexTriples;
    /*package*/ final Item<String[]>           tripleIndexes;

    /*package*/ final Item<String>             primaryIndexQuads;
    /*package*/ final Item<String[]>           quadIndexes;

    /*package*/ final Item<String>             prefixTableBaseName;
    /*package*/ final Item<String>             primaryIndexPrefix;
    /*package*/ final Item<String[]>           prefixIndexes;

    /** Build StoreParams, starting from system defaults.
     *
     * @return StoreParamsBuilder
     */
    public static StoreParamsBuilder builder() { return StoreParamsBuilder.create(); }

    /** Build StoreParams, starting from given default values.
     *
     * @return StoreParamsBuilder
     */
    public static StoreParamsBuilder builder(StoreParams params) { return StoreParamsBuilder.create(params); }

    /*package*/ StoreParams(Item<FileMode> fileMode, Item<Integer> blockSize,
                            Item<Integer> blockReadCacheSize, Item<Integer> blockWriteCacheSize,
                            Item<Integer> node2NodeIdCacheSize, Item<Integer> nodeId2NodeCacheSize,
                            Item<Integer> nodeMissCacheSize,

                            Item<String> nodeTableBaseName,
                            Item<String> primaryIndexTriples, Item<String[]> tripleIndexes,
                            Item<String> primaryIndexQuads, Item<String[]> quadIndexes,

                            Item<String> prefixTableBasename,
                            Item<String> primaryIndexPrefix, Item<String[]> prefixIndexes) {
        this.fileMode               = fileMode;
        this.blockSize              = blockSize;
        this.blockReadCacheSize     = blockReadCacheSize;
        this.blockWriteCacheSize    = blockWriteCacheSize;
        this.Node2NodeIdCacheSize   = node2NodeIdCacheSize;
        this.NodeId2NodeCacheSize   = nodeId2NodeCacheSize;
        this.NodeMissCacheSize      = nodeMissCacheSize;

        this.nodeTableBaseName      = nodeTableBaseName;

        this.primaryIndexTriples    = primaryIndexTriples;
        this.tripleIndexes          = tripleIndexes;
        this.primaryIndexQuads      = primaryIndexQuads;
        this.quadIndexes            = quadIndexes;
        this.primaryIndexPrefix     = primaryIndexPrefix;
        this.prefixIndexes          = prefixIndexes;

        this.prefixTableBaseName         = prefixTableBasename;
    }

    /** The system default settings. This is the normal set to use.
     *  It is the set of values used when no StoreParams is provided,
     *  which is the normal usage.
     */
    public static StoreParams getDftStoreParams() {
        return StoreParamsConst.dftStoreParams;
    }

    /** A {@code StoreParams} that provides a smaller
     * in-JVM foot print.  This is compatible with
     * any database but it is wise to use this consistently,
     * that is, use when created and when opened later.
     * It reduces cache sizes and runs the database in "direct"
     * file mode so as not to use memory mapped files
     * in addition to the JVM space.
     */
    public static StoreParams getSmallStoreParams() {
        return StoreParamsConst.smallStoreParams;
    }

    @Override
    public FileMode getFileMode() {
        return fileMode.value;
    }

    @Override
    public boolean isSetFileMode() {
        return fileMode.isSet;
    }

    @Override
    public Integer getBlockSize() {
        return blockSize.value;
    }

    @Override
    public Integer getBlockReadCacheSize() {
        return blockReadCacheSize.value;
    }

    @Override
    public boolean isSetBlockReadCacheSize() {
        return blockReadCacheSize.isSet;
    }

    @Override
    public Integer getBlockWriteCacheSize() {
        return blockWriteCacheSize.value;
    }

    @Override
    public boolean isSetBlockWriteCacheSize() {
        return blockWriteCacheSize.isSet;
    }

    @Override
    public Integer getNode2NodeIdCacheSize() {
        return Node2NodeIdCacheSize.value;
    }

    @Override
    public boolean isSetNodeId2NodeCacheSize() {
        return NodeId2NodeCacheSize.isSet;
    }

    @Override
    public boolean isSetNode2NodeIdCacheSize() {
        return Node2NodeIdCacheSize.isSet;
    }

    @Override
    public Integer getNodeId2NodeCacheSize() {
        return NodeId2NodeCacheSize.value;
    }

    @Override
    public Integer getNodeMissCacheSize() {
        return NodeMissCacheSize.value;
    }

    @Override
    public boolean isSetNodeMissCacheSize() {
        return NodeMissCacheSize.isSet;
    }

    public String getNodeTableBaseName() {
        return nodeTableBaseName.value;
    }

    public boolean isSetNodeTableBaseName() {
        return nodeTableBaseName.isSet;
    }

    public String getPrimaryIndexTriples() {
        return primaryIndexTriples.value;
    }

    public String[] getTripleIndexes() {
        return tripleIndexes.value;
    }

    public String getPrimaryIndexQuads() {
        return primaryIndexQuads.value;
    }

    public String[] getQuadIndexes() {
        return quadIndexes.value;
    }

    public String getPrefixTableBaseName() {
        return prefixTableBaseName.value;
    }

    public boolean isSetPrefixBaseName() {
        return prefixTableBaseName.isSet;
    }



    public String getPrimaryIndexPrefix() {
        return primaryIndexPrefix.value;
    }

    public String[] getPrefixIndexes() {
        return prefixIndexes.value;
    }

    @Override
    public String toString() {
        StringBuilder buff = new StringBuilder();
        fmt(buff, "fileMode", getFileMode().toString(), fileMode.isSet);
        fmt(buff, "blockSize", getBlockSize(), blockSize.isSet);
        fmt(buff, "readCacheSize", getBlockReadCacheSize(), blockReadCacheSize.isSet);
        fmt(buff, "writeCacheSize", getBlockWriteCacheSize(), blockWriteCacheSize.isSet);
        fmt(buff, "Node2NodeIdCacheSize", getNode2NodeIdCacheSize(), Node2NodeIdCacheSize.isSet);
        fmt(buff, "NodeId2NodeCacheSize", getNodeId2NodeCacheSize(), NodeId2NodeCacheSize.isSet);
        fmt(buff, "NodeMissCacheSize", getNodeMissCacheSize(), NodeMissCacheSize.isSet);

        fmt(buff, "nodeTableBaseName", getNodeTableBaseName(), nodeTableBaseName.isSet);
        fmt(buff, "primaryIndexTriples", getPrimaryIndexTriples(), primaryIndexTriples.isSet);
        fmt(buff, "tripleIndexes", getTripleIndexes(), tripleIndexes.isSet);
        fmt(buff, "primaryIndexQuads", getPrimaryIndexQuads(), primaryIndexQuads.isSet);
        fmt(buff, "quadIndexes", getQuadIndexes(), quadIndexes.isSet);

        fmt(buff, "prefixTableBaseName", getPrefixTableBaseName(), prefixTableBaseName.isSet);
        fmt(buff, "primaryIndexPrefix", getPrimaryIndexPrefix(), primaryIndexPrefix.isSet);
        fmt(buff, "prefixIndexes", getPrefixIndexes(), prefixIndexes.isSet);

        return buff.toString();
    }

    private void fmt(StringBuilder buff, String name, String[] strings, boolean isSet) {
        String dftStr = "";
        if ( ! isSet )
            dftStr = "dft:";
        buff.append(String.format("%-20s   %s[%s]\n", name, dftStr, String.join(", ", strings)));
    }

    private void fmt(StringBuilder buff, String name, String value, boolean isSet) {
        String dftStr = "";
        if ( ! isSet )
            dftStr = "dft:";
        buff.append(String.format("%-20s   %s%s\n", name, dftStr, value));
    }

    private void fmt(StringBuilder buff, String name, int value, boolean isSet) {
        String dftStr = "";
        if ( ! isSet )
            dftStr = "dft:";
        buff.append(String.format("%-20s   %s%s\n", name, dftStr, value));
    }

    /** Equality but ignore "isSet" */
    public static boolean sameValues(StoreParams params1, StoreParams params2) {
        if ( params1 == null && params2 == null )
            return true;
        if ( params1 == null )
            return false;
        if ( params2 == null )
            return false;
        if ( !sameValues(params1.fileMode, params2.fileMode) )
            return false;
        if ( !sameValues(params1.blockSize, params2.blockSize) )
            return false;
        if ( !sameValues(params1.blockReadCacheSize, params2.blockReadCacheSize) )
            return false;
        if ( !sameValues(params1.blockWriteCacheSize, params2.blockWriteCacheSize) )
            return false;
        if ( !sameValues(params1.Node2NodeIdCacheSize, params2.Node2NodeIdCacheSize) )
            return false;
        if ( !sameValues(params1.NodeId2NodeCacheSize, params2.NodeId2NodeCacheSize) )
            return false;
        if ( !sameValues(params1.NodeMissCacheSize, params2.NodeMissCacheSize) )
            return false;
        if ( !sameValues(params1.nodeTableBaseName, params2.nodeTableBaseName) )
            return false;
        if ( !sameValues(params1.primaryIndexTriples, params2.primaryIndexTriples) )
            return false;
        if ( !sameValues(params1.tripleIndexes, params2.tripleIndexes) )
            return false;
        if ( !sameValues(params1.primaryIndexQuads, params2.primaryIndexQuads) )
            return false;
        if ( !sameValues(params1.quadIndexes, params2.quadIndexes) )
            return false;
        if ( !sameValues(params1.prefixTableBaseName, params2.prefixTableBaseName) )
            return false;
        if ( !sameValues(params1.primaryIndexPrefix, params2.primaryIndexPrefix) )
            return false;
        if ( !sameValues(params1.prefixIndexes, params2.prefixIndexes) )
            return false;
        return true;
    }

    private static <X> boolean sameValues(Item<X> item1, Item<X> item2) {
        return Objects.deepEquals(item1.value, item2.value);
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((Node2NodeIdCacheSize == null) ? 0 : Node2NodeIdCacheSize.hashCode());
        result = prime * result + ((NodeId2NodeCacheSize == null) ? 0 : NodeId2NodeCacheSize.hashCode());
        result = prime * result + ((NodeMissCacheSize == null) ? 0 : NodeMissCacheSize.hashCode());
        result = prime * result + ((blockReadCacheSize == null) ? 0 : blockReadCacheSize.hashCode());
        result = prime * result + ((blockSize == null) ? 0 : blockSize.hashCode());
        result = prime * result + ((blockWriteCacheSize == null) ? 0 : blockWriteCacheSize.hashCode());
        result = prime * result + ((fileMode == null) ? 0 : fileMode.hashCode());
        result = prime * result + ((nodeTableBaseName == null) ? 0 : nodeTableBaseName.hashCode());
        result = prime * result + ((prefixTableBaseName == null) ? 0 : prefixTableBaseName.hashCode());
        result = prime * result + ((prefixIndexes == null) ? 0 : prefixIndexes.hashCode());
        result = prime * result + ((primaryIndexPrefix == null) ? 0 : primaryIndexPrefix.hashCode());
        result = prime * result + ((primaryIndexQuads == null) ? 0 : primaryIndexQuads.hashCode());
        result = prime * result + ((primaryIndexTriples == null) ? 0 : primaryIndexTriples.hashCode());
        result = prime * result + ((quadIndexes == null) ? 0 : quadIndexes.hashCode());
        result = prime * result + ((tripleIndexes == null) ? 0 : tripleIndexes.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if ( this == obj )
            return true;
        if ( obj == null )
            return false;
        if ( getClass() != obj.getClass() )
            return false;
        StoreParams other = (StoreParams)obj;
        if ( Node2NodeIdCacheSize == null ) {
            if ( other.Node2NodeIdCacheSize != null )
                return false;
        } else if ( !Node2NodeIdCacheSize.equals(other.Node2NodeIdCacheSize) )
            return false;
        if ( NodeId2NodeCacheSize == null ) {
            if ( other.NodeId2NodeCacheSize != null )
                return false;
        } else if ( !NodeId2NodeCacheSize.equals(other.NodeId2NodeCacheSize) )
            return false;
        if ( NodeMissCacheSize == null ) {
            if ( other.NodeMissCacheSize != null )
                return false;
        } else if ( !NodeMissCacheSize.equals(other.NodeMissCacheSize) )
            return false;
        if ( blockReadCacheSize == null ) {
            if ( other.blockReadCacheSize != null )
                return false;
        } else if ( !blockReadCacheSize.equals(other.blockReadCacheSize) )
            return false;
        if ( blockSize == null ) {
            if ( other.blockSize != null )
                return false;
        } else if ( !blockSize.equals(other.blockSize) )
            return false;
        if ( blockWriteCacheSize == null ) {
            if ( other.blockWriteCacheSize != null )
                return false;
        } else if ( !blockWriteCacheSize.equals(other.blockWriteCacheSize) )
            return false;
        if ( fileMode == null ) {
            if ( other.fileMode != null )
                return false;
        } else if ( !fileMode.equals(other.fileMode) )
            return false;
        if ( nodeTableBaseName == null ) {
            if ( other.nodeTableBaseName != null )
                return false;
        } else if ( !nodeTableBaseName.equals(other.nodeTableBaseName) )
            return false;
        if ( prefixTableBaseName == null ) {
            if ( other.prefixTableBaseName != null )
                return false;
        } else if ( !prefixTableBaseName.equals(other.prefixTableBaseName) )
            return false;
        if ( prefixIndexes == null ) {
            if ( other.prefixIndexes != null )
                return false;
        } else if ( !prefixIndexes.equals(other.prefixIndexes) )
            return false;
        if ( primaryIndexPrefix == null ) {
            if ( other.primaryIndexPrefix != null )
                return false;
        } else if ( !primaryIndexPrefix.equals(other.primaryIndexPrefix) )
            return false;
        if ( primaryIndexQuads == null ) {
            if ( other.primaryIndexQuads != null )
                return false;
        } else if ( !primaryIndexQuads.equals(other.primaryIndexQuads) )
            return false;
        if ( primaryIndexTriples == null ) {
            if ( other.primaryIndexTriples != null )
                return false;
        } else if ( !primaryIndexTriples.equals(other.primaryIndexTriples) )
            return false;
        if ( quadIndexes == null ) {
            if ( other.quadIndexes != null )
                return false;
        } else if ( !quadIndexes.equals(other.quadIndexes) )
            return false;
        if ( tripleIndexes == null ) {
            if ( other.tripleIndexes != null )
                return false;
        } else if ( !tripleIndexes.equals(other.tripleIndexes) )
            return false;
        return true;
    }
}

