/*
 * Copyright 2017 gitblit.com.
 *
 * Licensed 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 com.gitblit.utils;

import java.io.File;
import java.nio.file.Path;

/**
 * @author Florian Zschocke
 *
 * @since 1.9.0
 */
public class LuceneIndexStore
{

	public static final int LUCENE_CODEC_VERSION = 54;

	protected File indexFolder;

	/**
	 * Constructor for a base folder that contains the version specific index folders
	 * and an index version.
	 *
	 * @param luceneFolder
	 * 			Path to the base folder for the Lucene indices, i.e. the common "lucene" directory.
	 * @param indexVersion
	 * 			Version of the index definition
	 */
	public LuceneIndexStore(File luceneFolder, int indexVersion)
	{
		this.indexFolder = new File(luceneFolder, indexVersion + "_" + LUCENE_CODEC_VERSION);
	}



	/**
	 * Create the Lucene index directory for this index version and Lucene codec version
	 */
	public void create()
	{
		if (! indexFolder.exists()) {
			indexFolder.mkdirs();
		}
	}


	/**
	 * Delete the Lucene index directory for this index version and Lucene codec version
	 *
	 * @return	True if the directory could successfully be deleted.
	 */
	public boolean delete()
	{
		if (indexFolder.exists()) {
			return FileUtils.delete(indexFolder);
		}
		return true;
	}



	/**
	 * @return	The Path to the index folder
	 */
	public Path getPath()
	{
		return indexFolder.toPath();
	}



	/**
	 * Check if an index of the respective version, or compatible, already exists.
	 *
	 * @return	True if an index exists, False otherwise
	 */
	public boolean hasIndex()
	{
		return indexFolder.exists() &&
				indexFolder.isDirectory() &&
				(indexFolder.list().length > 1);  // Must have more than 'write.lock'
	}

}
