package ru.hflabs.rcd.service.rule;
import ru.hflabs.rcd.RoleNames;
import ru.hflabs.rcd.model.document.Dictionary;
import ru.hflabs.rcd.model.path.DirectionNamedPath;
import ru.hflabs.rcd.model.path.MetaFieldNamedPath;
import ru.hflabs.rcd.model.rule.RecodeRuleSet;
import ru.hflabs.rcd.service.IDocumentService;
import ru.hflabs.rcd.service.INamedPathService;
import javax.annotation.security.RolesAllowed;
import java.util.Collection;
import java.util.Set;
/**
* Интерфейс <class>IRecodeRuleSetService</class> декларирует методы для работы с наборами правил перекодирования
*
* @see RecodeRuleSet
*/
public interface IRecodeRuleSetService extends IDocumentService<RecodeRuleSet>, INamedPathService<String, RecodeRuleSet>, IRuleService<RecodeRuleSet> {
/**
* Выполняет поиск набора правил перекодирования по именованным путям
*
* @param fromPath именованный путь исходного справочника
* @param toPath именованный путь целевого справочника
* @param fillTransitive флаг необходимости заполнения транзитивных зависимостей
* @param quietly флаг безопасной проверки существования набора правил
* @return Возвращает набор правил или <code>NULL</code>, если установлен флаг <i>quietly</i> и такого набора не найдено
*/
@RolesAllowed(RoleNames.OPERATOR)
RecodeRuleSet findRecodeRuleSetByNamedPath(MetaFieldNamedPath fromPath, MetaFieldNamedPath toPath, boolean fillTransitive, boolean quietly);
/**
* Выполняет поиск наборов правил перекодирования по именованным путям
*
* @param rulePaths коллекция именованных направленных путей
* @param fillTransitive флаг необходимости заполнения транзитивных зависимостей
* @return Возвращает коллекция найденных наборов
*/
@RolesAllowed(RoleNames.OPERATOR)
Collection<RecodeRuleSet> findRecodeRuleSetByNamedPath(Collection<DirectionNamedPath<MetaFieldNamedPath>> rulePaths, boolean fillTransitive);
/**
* Выполняет поиск несопоставленных справочников
* <p/>
* Справочник считается несопоставленным если:
* <ul>
* <li>нет ни одного набора правил перекодирования</li>
* <li>есть хотя бы один набор перекодировок, где справочник выступает в качестве исходного,
* при этом нет умолчательного значения,
* и хотя бы одна запись исходного справочника не сопоставлена
* </li>
* </ul>
*
* @param groupId идентификатор группы, для которой необходимо найти целевые справочники
* @param fillTransitive флаг необходимости заполнения транзитивных зависимостей
* @return Возвращает несопоставленные справочники
*/
@RolesAllowed(RoleNames.OPERATOR)
Set<Dictionary> findUnmatchedDictionaries(String groupId, boolean fillTransitive);
}