/*
 * CFilesystemLoader.h, part of VCMI engine
 *
 * Authors: listed in file AUTHORS in main folder
 *
 * License: GNU General Public License v2.0 or later
 * Full text of license available in license.txt file, in main folder
 *
 */

#pragma once

#include "ISimpleResourceLoader.h"

class CFileInfo;
class CInputStream;

/**
 * A class which can scan and load files of directories.
 */
class DLL_LINKAGE CFilesystemLoader : public ISimpleResourceLoader
{
public:
	/**
	 * Default c-tor.
	 */
	CFilesystemLoader();

	/**
	 * Ctor.
	 *
	 * @param baseDirectory Specifies the base directory and their sub-directories which should be indexed.
	 * @param depth - recursion depth of subdirectories search. 0 = no recursion
	 *
	 * @throws std::runtime_error if the base directory is not a directory or if it is not available
	 */
	explicit CFilesystemLoader(const std::string & baseDirectory, size_t depth = 16);

	/**
	 * Ctor.
	 *
	 * @param baseDirectory Specifies the base directory and their sub-directories which should be indexed.
	 *
	 * @throws std::runtime_error if the base directory is not a directory or if it is not available
	 */
	explicit CFilesystemLoader(const CFileInfo & baseDirectory, size_t depth = 16);

	/**
	 * Opens a base directory to be read and indexed.
	 *
	 * @param baseDirectory Specifies the base directory and their sub-directories which should be indexed.
	 *
	 * @throws std::runtime_error if the base directory is not a directory or if it is not available
	 */
	void open(const std::string & baseDirectory, size_t depth);

	/**
	 * Loads a resource with the given resource name.
	 *
	 * @param resourceName The unqiue resource name in space of the filesystem.
	 * @return a input stream object, not null
	 */
	std::unique_ptr<CInputStream> load(const std::string & resourceName) const;

	/**
	 * Checks if the file entry exists.
	 *
	 * @return true if the entry exists, false if not.
	 */
	bool existsEntry(const std::string & resourceName) const;

	/**
	 * Gets all entries in the filesystem.
	 *
	 * @return a list of all entries in the filesystem.
	 */
	std::list<std::string> getEntries() const;

	/**
	 * Gets the origin of the archive loader.
	 *
	 * @return the file path to directory with archive (e.g. path/to/h3/mp3)
	 */
	std::string getOrigin() const;

private:
	/** The base directory which is scanned and indexed. */
	std::string baseDirectory;

	/** A list of files in the directory */
	std::list<CFileInfo> fileList;
};