// ------------------------------------------------------------------------------------
// <copyright file="IEstadosAccion.cs" company="Universidad Distrital">
// Copyright (c) Universidad Distrital. All rights reserved.
// </copyright>
// <author>Camilo Prieto</author>
// ------------------------------------------------------------------------------------
namespace Biblioteca.IC.Acciones.Repositorio
{
	using System;
	using System.Collections.Generic;
	using System.Linq.Expressions;
	using System.Threading.Tasks;
	using UtilitariosNet.Clases.Comunes.Entidades;
	using Biblioteca.IC.DTO.Repositorio;

	/// <summary>
	/// Interface que define las acciones que se implmentara en todas las capas de IEstadosAccion
	/// </summary>
	public interface IEstadosAccion
	{
		/// <summary>
		/// Metodo guardar estados
		/// </summary>
		/// <param name="estados">Entidad a guardar</param>
		/// <returns>Respuesta tipo Estados </returns>
		Task<Respuesta<IEstadosDTO>> GuardarEstadosAsync(IEstadosDTO estados);
		/// <summary>
		/// Metodo Guardar lista estados
		/// </summary>
		/// <param name="listaEstados">Lista de entidades a guardar</param>
		/// <returns>Respuesta tipo Estados </returns>
		Task<Respuesta<IEstadosDTO>> GuardarListaEstadosAsync(List<IEstadosDTO> listaEstados);
		/// <summary>
		/// Metodo editar estados
		/// </summary>
		/// <param name="estados">Entidad a editar</param>
		/// <returns>Respuesta tipo Estados </returns>
		Task<Respuesta<IEstadosDTO>> EditarEstadosAsync(IEstadosDTO estados);
		/// <summary>
		/// Metodo consultar lista estados
		/// </summary>
		/// <returns>Respuesta tipo Estados </returns>
		Task<Respuesta<IEstadosDTO>> ConsultarListaEstadosAsync();
		/// <summary>
		/// Metodo consultar por llave estados
		/// </summary>
		/// <param name="estados">Entidad a consultar</param>
		/// <returns>Respuesta tipo Estados </returns>
		Task<Respuesta<IEstadosDTO>> ConsultarEstadosLlaveAsync(IEstadosDTO estados);
		/// <summary>
		/// Metodo eliminar estados
		/// </summary>
		/// <param name="estados">Entidad a eliminar</param>
		/// <returns>Respuesta tipo Estados </returns>
		Task<Respuesta<IEstadosDTO>> EliminarEstadosAsync(IEstadosDTO estados);
	}


	/// <summary>
	/// Interface que define las acciones de la capa de repositorioIEstadosAccion
	/// </summary>
	public interface IEstadosRepositorioAccion:IEstadosAccion
	{
		/// <summary>
		/// Metodo editar estados por query 
		/// </summary>
		/// <param name="filtro">Filtro de las entidades </param>
		/// <param name="valor">Entidad a mofificar</param>
		/// <param name="propiedades">Propiedades a modificar</param>
		/// <returns>Respuesta tipo Estados </returns>
		Task<Respuesta<IEstadosDTO>> EditarPorQueryEstadosAsync(Expression<Func<IEstadosDTO, bool>> filtro, IEstadosDTO valor, List<string> propiedades);
		/// <summary>
		/// Metodo consultar lista estados por filtro 
		/// </summary>
		/// <param name="filtro">Filtro de las entidades </param>
		/// <returns>Respuesta tipo Estados </returns>
		Task<Respuesta<IEstadosDTO>> ConsultarListaEstadosPorFiltroAsync(Expression<Func<IEstadosDTO, bool>> filtro);
		/// <summary>
		/// Metodo editar  estados por filtro 
		/// </summary>
		/// <param name="estados">Entidad con los datos a editar</param>
		/// <param name="propiedades">Propiedades a modificar</param>
		/// <returns>Respuesta tipo Estados </returns>
		Task<Respuesta<IEstadosDTO>> EditarEstadosPorFiltroAsync(IEstadosDTO estados, params string[] propiedades);
		/// <summary>
		/// Metodo eliminar lista estados 
		/// </summary>
		/// <param name="lista">Lista de entidad a eliminar</param>
		/// <returns>Respuesta tipo Estados </returns>
		Task<Respuesta<IEstadosDTO>> EliminarListaEstadosAsync(List<IEstadosDTO> lista);
		/// <summary>
		/// Metodo editar estados lista 
		/// </summary>
		/// <param name="lista"> Lista con entidades a modificar</param>
		/// <returns>Respuesta tipo Estados </returns>
		Task<Respuesta<IEstadosDTO>> EditarListaEstadosAsync(List<IEstadosDTO> lista);
	}


	/// <summary>
	/// Interface que define las acciones de la capa de negocioIEstadosAccion
	/// </summary>
	public interface IEstadosNegocioAccion:IEstadosAccion
	{
	}
}
