package fyloz.trial.ColorRecipesExplorer.services;

import fyloz.trial.ColorRecipesExplorer.model.BeanModel;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

public interface IGenericService<T extends BeanModel> {

    /**
     * Récupère toutes les entités du même type dans la base de données.
     *
     * @return Une liste de toutes les entités du même type.
     */
    List<T> getAll();

    /**
     * Récupère l'entité correspondant à l'identifiant spécifié dans la base de données.
     *
     * @param id L'identifiant de l'entité
     * @return L'entité correspondant à l'identifiant.
     */
    T getByID(int id);

    /**
     * Sauvegarde une entité dans la base de données.
     * <p>
     * La sauvegarde sera exécutée si l'entité est valide pour la création.
     *
     * @param entity L'entité à sauvegarder
     * @return Si la sauvegarde a fonctionné.
     */
    T save(T entity);

    /**
     * Sauvegarde des entités dans la base de données.
     * <p>
     * Les sauvegardes seront exécutée si toutes les entités sont valides pour la création.
     *
     * @param entities La liste d'entités à sauvegarder
     * @return Si la sauvegarde a fonctionné.
     */
    @Transactional
    boolean saveAll(List<T> entities);

    /**
     * Met à jour une entité dans la base de données.
     * <p>
     * La mise à jour sera exécutée si l'entité existe dans la BDD.
     *
     * @param entity L'entité à mettre à jour
     * @return Si la mise à jour a fonctionné.
     */
    T update(T entity);

    /**
     * Supprime une entité dans la base de données.
     * <p>
     * La suppression sera exécutée si l'entité existe dans la BDD.
     *
     * @param entity L'entité à supprimer
     * @return Si la suppression a fonctionné.
     */
    boolean delete(T entity);

    /**
     * Supprime des entités dans la base de données.
     * <p>
     * Les suppressions seront exécutée si toutes les entités existes dans la BDD.
     *
     * @param entities La liste d'entités à supprimer
     * @return Si la suppression a fonctionné.
     */
    @Transactional
    boolean deleteAll(List<T> entities);

    boolean exists(T entity);
}
