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

	/// <summary>
	/// Clase con las acciones de repositorio para la entidad PrestamosUsuarios
	/// </summary>
	public class PrestamosUsuariosDAL : AccesoComunDAL<ContextoBiblioteca>, IPrestamosUsuariosRepositorioAccion
	{
		/// <summary>
		/// Objeto para entidad respuesta
		/// </summary>
		Respuesta<IPrestamosUsuariosDTO> respuesta;

		/// <summary>
		/// Objeto para repositorio PrestamosUsuarios
		/// </summary>
		RepositorioGenerico<PrestamosUsuarios> repositorio;

		/// <summary>
		/// Inicializa una nueva instancia de la clase PrestamosUsuariosDAL
		/// </summary>
		public PrestamosUsuariosDAL()
		{
			this.respuesta = new Respuesta<IPrestamosUsuariosDTO>();
			this.repositorio = new RepositorioGenerico<PrestamosUsuarios>(ContextoBD);
		}

		/// <summary>
		/// Metodo editar prestamosUsuarios
		/// </summary>
		/// <param name="prestamosUsuarios">Entidad a editar</param>
		/// <returns>Respuesta tipo PrestamosUsuarios </returns>
		public async Task<Respuesta<IPrestamosUsuariosDTO>> EditarPrestamosUsuariosAsync(IPrestamosUsuariosDTO prestamosUsuarios)
		{
			return await this.EjecutarTransaccionAsync<Respuesta<IPrestamosUsuariosDTO>, PrestamosUsuariosDAL>(async () =>
			{
				PrestamosUsuarios PrestamosUsuariosEntidad = repositorio.BuscarPor(entidad => entidad
					.IdTiquetePrestamo == prestamosUsuarios.IdTiquetePrestamo).FirstOrDefault();
				Mapeador.MapearObjetosPorPropiedad(prestamosUsuarios, PrestamosUsuariosEntidad);
				repositorio.Editar(PrestamosUsuariosEntidad);
				repositorio.Guardar();
				return respuesta;
			});
		}

		/// <summary>
		/// Metodo editar  prestamosUsuarios por filtro 
		/// </summary>
		/// <param name="prestamosUsuarios">Entidad con los datos a editar</param>
		/// <param name="propiedades">Propiedades a modificar</param>
		/// <returns>Respuesta tipo PrestamosUsuarios </returns>
		public async Task<Respuesta<IPrestamosUsuariosDTO>> EditarPrestamosUsuariosPorFiltroAsync(IPrestamosUsuariosDTO prestamosUsuarios, params string[] propiedades)
        {
            return await this.EjecutarTransaccionAsync<Respuesta<IPrestamosUsuariosDTO>, PrestamosUsuariosDAL>(async () =>
            {
                PrestamosUsuarios prestamosUsuariosEntidad = repositorio.BuscarPor(entidad => entidad
                .IdTiquetePrestamo == prestamosUsuarios.IdTiquetePrestamo).FirstOrDefault();
                Mapeador.MapearObjetosPorPropiedadPorFiltro(prestamosUsuarios, prestamosUsuariosEntidad, propiedades);
                repositorio.Editar(prestamosUsuariosEntidad);
                      repositorio.Guardar();
                return respuesta;
            });
        }


		/// <summary>
		/// Metodo editar prestamosUsuarios 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 PrestamosUsuarios </returns>
		public async Task<Respuesta<IPrestamosUsuariosDTO>> EditarPorQueryPrestamosUsuariosAsync(Expression<Func<IPrestamosUsuariosDTO, bool>> filtro, IPrestamosUsuariosDTO valor, List<string> propiedades)
        {
            return await this.EjecutarTransaccionAsync<Respuesta<IPrestamosUsuariosDTO>, PrestamosUsuariosDAL>(async () =>
            {
          PrestamosUsuarios PrestamosUsuariosEntidad = Mapeador.MapearEntidadDTO(valor, new PrestamosUsuarios());
                Expression<Func<PrestamosUsuarios, bool>> filtros = Mapeador.MapearExpresion<IPrestamosUsuariosDTO, PrestamosUsuarios>(filtro);
                await repositorio.EditarPorQueryAsync(filtros, PrestamosUsuariosEntidad, propiedades);
                await repositorio.GuardarAsync();
                return respuesta;
            });
        }


		/// <summary>
		/// Metodo editar prestamosUsuarios lista 
		/// </summary>
		/// <param name="lista"> Lista con entidades a modificar</param>
		/// <returns>Respuesta tipo PrestamosUsuarios </returns>
		public async Task<Respuesta<IPrestamosUsuariosDTO>> EditarListaPrestamosUsuariosAsync(List<IPrestamosUsuariosDTO> lista)
        {
            return await this.EjecutarTransaccionAsync<Respuesta<IPrestamosUsuariosDTO>, PrestamosUsuariosDAL>(async () =>
            {
                List<PrestamosUsuarios> listaPrestamosUsuarios = new List<PrestamosUsuarios>();
                listaPrestamosUsuarios = Mapeador.MapearALista<IPrestamosUsuariosDTO, PrestamosUsuarios>(lista);
               await repositorio.EditarListaAsync(listaPrestamosUsuarios);
               await repositorio.GuardarAsync();
                return respuesta;
            });
        }

		/// <summary>
		/// Metodo eliminar prestamosUsuarios
		/// </summary>
		/// <param name="prestamosUsuarios">Entidad a eliminar</param>
		/// <returns>Respuesta tipo PrestamosUsuarios </returns>
        public async Task<Respuesta<IPrestamosUsuariosDTO>> EliminarPrestamosUsuariosAsync(IPrestamosUsuariosDTO prestamosUsuarios)
        {
            return await this.EjecutarTransaccionAsync<Respuesta<IPrestamosUsuariosDTO>, PrestamosUsuariosDAL>(async () =>
            {
				PrestamosUsuarios PrestamosUsuariosEntidad = repositorio.BuscarPor(entidad => entidad
					.IdTiquetePrestamo == prestamosUsuarios.IdTiquetePrestamo).FirstOrDefault();
				Mapeador.MapearObjetosPorPropiedad(prestamosUsuarios, PrestamosUsuariosEntidad);
				repositorio.Eliminar(PrestamosUsuariosEntidad);
                repositorio.Guardar();
                return respuesta;
            });
        }


		/// <summary>
		/// Metodo eliminar lista prestamosUsuarios 
		/// </summary>
		/// <param name="lista">Lista de entidad a eliminar</param>
		/// <returns>Respuesta tipo PrestamosUsuarios </returns>
        public async Task<Respuesta<IPrestamosUsuariosDTO>> EliminarListaPrestamosUsuariosAsync(List<IPrestamosUsuariosDTO> lista)
        {
            return await this.EjecutarTransaccionAsync<Respuesta<IPrestamosUsuariosDTO>, PrestamosUsuariosDAL>(async () =>
            {
                List<PrestamosUsuarios> listaPrestamosUsuarios = new List<PrestamosUsuarios>();
                listaPrestamosUsuarios = Mapeador.MapearALista<IPrestamosUsuariosDTO, PrestamosUsuarios>(lista);
               await repositorio.EliminarListaAsync(listaPrestamosUsuarios);
               await repositorio.GuardarAsync();
                return respuesta;
            });
        }

		/// <summary>
		/// Metodo guardar prestamosUsuarios
		/// </summary>
		/// <param name="prestamosUsuarios">Entidad a guardar</param>
		/// <returns>Respuesta tipo PrestamosUsuarios </returns>
        public async Task<Respuesta<IPrestamosUsuariosDTO>> GuardarPrestamosUsuariosAsync(IPrestamosUsuariosDTO prestamosUsuarios)
        {
            return await this.EjecutarTransaccionAsync<Respuesta<IPrestamosUsuariosDTO>, PrestamosUsuariosDAL>(async () =>
            {
                PrestamosUsuarios PrestamosUsuariosEntidad = Mapeador.MapearEntidadDTO(prestamosUsuarios, new PrestamosUsuarios());
               await repositorio.AgregarAsync(PrestamosUsuariosEntidad);
               await repositorio.GuardarAsync();
                respuesta.Entidades.Add(PrestamosUsuariosEntidad);
                return respuesta;

            });
        }

		/// <summary>
		/// Metodo Guardar lista prestamosUsuarios
		/// </summary>
		/// <param name="listaPrestamosUsuarios">Lista de entidades a guardar</param>
		/// <returns>Respuesta tipo PrestamosUsuarios </returns>
        public async Task<Respuesta<IPrestamosUsuariosDTO>> GuardarListaPrestamosUsuariosAsync(List<IPrestamosUsuariosDTO> listaPrestamosUsuarios)
        {
            return await this.EjecutarTransaccionAsync<Respuesta<IPrestamosUsuariosDTO>, PrestamosUsuariosDAL>(async () =>
            {
                List<PrestamosUsuarios> listaPrestamosUsuariosEntidad = Mapeador.MapearALista<IPrestamosUsuariosDTO, PrestamosUsuarios>(listaPrestamosUsuarios);
               await repositorio.AgregarListaAsync(listaPrestamosUsuariosEntidad);
                respuesta.Entidades.AddRange(listaPrestamosUsuariosEntidad);
                return respuesta;
            });
        }

		/// <summary>
		/// Metodo consultar lista prestamosUsuarios
		/// </summary>
		/// <returns>Respuesta tipo PrestamosUsuarios </returns>
        public async Task<Respuesta<IPrestamosUsuariosDTO>> ConsultarListaPrestamosUsuariosAsync()
        {
            return await this.EjecutarTransaccionAsync<Respuesta<IPrestamosUsuariosDTO>, PrestamosUsuariosDAL>(async () =>
            {
                respuesta.Entidades = repositorio.BuscarTodos().ToList<IPrestamosUsuariosDTO>();
                return respuesta;

            });
        }

		/// <summary>
		/// Metodo consultar lista prestamosUsuarios por filtro 
		/// </summary>
		/// <param name="prestamosUsuarios">Entidad con los datos a filtrar</param>
		/// <param name="filtro">Filtro de las entidades </param>
		/// <returns>Respuesta tipo PrestamosUsuarios </returns>
        public async Task<Respuesta<IPrestamosUsuariosDTO>> ConsultarListaPrestamosUsuariosPorFiltroAsync(Expression<Func<IPrestamosUsuariosDTO, bool>> filtro)
        {
            return await this.EjecutarTransaccionAsync<Respuesta<IPrestamosUsuariosDTO>, PrestamosUsuariosDAL>(async () =>
            {
                respuesta.Entidades = repositorio.BuscarPor(Mapeador.MapearExpresion<IPrestamosUsuariosDTO, PrestamosUsuarios>(filtro)).ToList<IPrestamosUsuariosDTO>();
                return respuesta;

            });
        }

		/// <summary>
		/// Metodo consultar por llave prestamosUsuarios
		/// </summary>
		/// <param name="prestamosUsuarios">Entidad a consultar</param>
		/// <returns>Respuesta tipo PrestamosUsuarios </returns>
        public async Task<Respuesta<IPrestamosUsuariosDTO>> ConsultarPrestamosUsuariosLlaveAsync(IPrestamosUsuariosDTO prestamosUsuarios)
        {
            return await this.EjecutarTransaccionAsync<Respuesta<IPrestamosUsuariosDTO>, PrestamosUsuariosDAL>(async () =>
            {
                respuesta.Entidades = (from entidad in ContextoBD.PrestamosUsuarios
                                       where entidad.IdTiquetePrestamo == prestamosUsuarios.IdTiquetePrestamo
                                       select entidad).ToList<IPrestamosUsuariosDTO>();

                return respuesta;

            });
        }
    }
}

