package ru.hflabs.rcd.service;
import ru.hflabs.rcd.model.Essence;
import ru.hflabs.rcd.model.Historical;
import ru.hflabs.rcd.model.change.ChangeType;
import ru.hflabs.rcd.model.change.History;
import ru.hflabs.rcd.model.change.HistoryBuilder;
import ru.hflabs.util.core.Pair;
import java.util.Date;
import java.util.Map;
/**
* Интерфейс <class>IHistoryService</class> декларирует методы работы с историей документов
*
* @see Historical
* @see History
*/
public interface IHistoryService extends IFilterService<History> {
/**
* Формирует историю отмены закрытия сущности
*
* @param essence переоткрываемая сущность
* @return Возвращает сущность с заполненной историей
*/
<E extends Essence & Historical> E createRestoreHistory(E essence);
/**
* Формирует историю модификации для сущности, где в качестве даты выставляется время открытия транзакции, а в качестве автора - текущий пользователь
*
* @param oldEssence существующая сущность
* @param newEssence обновленная сущность
* @return Возвращает сущность с заполненной историей модификации
*/
<E extends Essence & Historical> Pair<ChangeType, E> createChangeHistory(E oldEssence, E newEssence);
/**
* Формирует историю модификации для сущности
*
* @param date дата изменения
* @param author автор изменения
* @param oldEssence существующая сущность
* @param newEssence обновленная сущность
* @return Возвращает сущность с заполненной историей модификации
*/
<E extends Essence & Historical> Pair<ChangeType, E> createChangeHistory(Date date, String author, E oldEssence, E newEssence);
/**
* Выполняет построение дескриптора изменений
*
* @param targetClass целевой класс сущности
* @param existedEssences коллекция существующих сущностей
* @param newEssences коллекция новых сущностей
* @param mergeService сервис слияния новой и старой сущности
* @return Возвращает построенный дескриптор
*/
<E extends Essence & Historical> HistoryBuilder<E> createChangeSet(
Class<E> targetClass,
Map<String, E> existedEssences,
Map<String, E> newEssences,
IMergeService.Single<E> mergeService
);
/**
* Выполняет построение дескриптора изменений
*
* @param targetClass целевой класс сущности
* @param date дата изменения
* @param author автор изменения
* @param existedEssences коллекция существующих сущностей
* @param newEssences коллекция новых сущностей
* @param mergeService сервис слияния новой и старой сущности
* @return Возвращает построенный дескриптор
*/
<E extends Essence & Historical> HistoryBuilder<E> createChangeSet(
Class<E> targetClass,
Date date,
String author,
Map<String, E> existedEssences,
Map<String, E> newEssences,
IMergeService.Single<E> mergeService
);
}