package info.bukova.isspst.storage;

import info.bukova.isspst.data.FileMetainfo;

import java.io.File;

/**
 * Rozhraní servisního objektu pro práci s přílohami u záznamů. Přílohy jsou reprezentovány objektem FileMetainfo,
 * kde je zobrazované jméno souboru, vygenerovaný GUID, pod kterým je soubor fyzicky uložen a MD5 součet používaný
 * pro deduplikaci.
 *
 * @see info.bukova.isspst.data.FileMetainfo
 *
 * @author  Pepa Rokos
 */
public interface DocumentFileStorage extends FileStorage<FileMetainfo> {

	/**
	 * Uloží data předaná jako byte[] do uložiště příloh a vrátí metainformace.
	 * Metoda řeší deduplikaci souborů, takže v uložišti je fyzicky vždy jen jedna kopie.
	 *
	 * @see info.bukova.isspst.data.FileMetainfo
	 *
	 * @param data Data souboru
	 * @param name Zobrazovaný název souboru
	 * @return Metainformace o souboru
	 */
	public FileMetainfo saveAndCreateInfo(byte[] data, String name);

	/**
	 * Uloží data předaná jako File do uložiště příloh a vrátí metainformace.
	 * Metoda řeší deduplikaci souborů, takže v uložišti je fyzicky vždy jen jedna kopie.
	 *
	 * @see info.bukova.isspst.data.FileMetainfo
	 *
	 * @param file Objekt reprezentující soubor
	 * @param name Zobrazovaný název souboru
	 * @return Metainformace o souboru
	 */
	public FileMetainfo saveAndCreateInfo(File file, String name);

	/**
	 * Vrátí metainformace podle fyzické cesty v uložišti.
	 *
	 * @param path Cesta k souboru v uložišti
	 * @return Metainformace o souboru
	 */
	public FileMetainfo getMetainfoForPath(String path);

	/**
	 * Bezpečně odstraní přílohu ze záznamu. Záznam o příloze odstraní z kolekce příloh a následně zavolá metodu
	 * removeFile(FileMetainfo info), která soubor fyzicky smaže, pokud už není nikam linkovaný.
	 *
	 * @param entity Entita s přílohami
	 * @param metaInfo Příloha k odstranění
	 */
	public void removeAttachment(EntityWithAttachment entity, FileMetainfo metaInfo);

	/**
	 * Bezpečně odstraní všechny přílohy ze záznamu.
	 *
	 * @param entity Entita s přílohami
	 */
	public void removeAllAttachments(EntityWithAttachment entity);

	/**
	 * Uklidí soubory, na které neexistuje reference v databázi a z tabulky FILE_CONTENTS vymaže záznamy, na které
	 * neexistuje refernece z FILE_METAINFO
	 */
	public void purge();

}
