// ------------------------------------------------------------------------------------
// <copyright file="PrestamosUsuariosBL.cs" company="Universidad Distrital">
// Copyright (c) Universidad Distrital. All rights reserved.
// </copyright>
// <author>Camilo Prieto</author>
// ------------------------------------------------------------------------------------
namespace Biblioteca.Negocio.Clases.BL
{
	using System;
	using System.Collections.Generic;
	using System.Threading.Tasks;
	using Biblioteca.Datos.Clases.DAL.Repositorio;
	using Biblioteca.IC.Acciones.Repositorio;
	using Biblioteca.IC.DTO.Repositorio;
	using Biblioteca.IC.Recursos;
	using TransaccionalNet.EF.Clases;
	using UtilitariosNet.Clases.Comunes.Entidades;
	using Utilitarios.TransversalesNet.Clases.Comunes.Enumeraciones;

	/// <summary>
	/// Clase con las acciones de negocio de la entidad PrestamosUsuarios
	/// </summary>
	public class PrestamosUsuariosBL : AccesoComunBL, IPrestamosUsuariosNegocioAccion
	{

		#region ATRIBUTOS
		/// <summary>
		/// Objeto para repositorio PrestamosUsuarios
		/// <summary>
		/// Objeto para acciones PrestamosUsuarios
		/// </summary>
		private Lazy<IPrestamosUsuariosRepositorioAccion> prestamosUsuariosRepositorioAccion;

		/// <summary>
		/// Objeto para entidad respuesta
		/// </summary>
		Respuesta<IPrestamosUsuariosDTO> respuesta;

		#endregion ATRIBUTOS
		#region CONSTRUCTORES
		/// <summary>
		/// Inicializa una nueva instancia de la clase PrestamosUsuariosBL
		/// </summary>
		/// <param name="argPrestamosUsuariosRepositorioAccion">Acciones entidad PrestamosUsuarios</param>
		public PrestamosUsuariosBL(Lazy<IPrestamosUsuariosRepositorioAccion> argPrestamosUsuariosRepositorioAccion = null)
		{
			this.respuesta = new Respuesta<IPrestamosUsuariosDTO>();
			this.prestamosUsuariosRepositorioAccion = argPrestamosUsuariosRepositorioAccion ?? new Lazy<IPrestamosUsuariosRepositorioAccion>(() => new PrestamosUsuariosDAL());
		}

		#endregion CONSTRUCTORES
		#region METODOS PUBLICOS
		/// <summary>
		/// Metodo consultar lista prestamosUsuarios
		/// </summary>
		/// <returns>Respuesta tipo PrestamosUsuarios </returns>
		public async Task<Respuesta<IPrestamosUsuariosDTO>> ConsultarListaPrestamosUsuariosAsync()
		{

			return await this.EjecutarTransaccionBDAsync<Respuesta<IPrestamosUsuariosDTO>, PrestamosUsuariosBL>(
			System.Transactions.IsolationLevel.ReadUncommitted,
			async () =>
			{
				 respuesta= await this.prestamosUsuariosRepositorioAccion.Value.ConsultarListaPrestamosUsuariosAsync();
				 respuesta.Resultado = true;
				 respuesta.TipoNotificacion = TipoNotificacion.Exitoso;
				 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.EjecutarTransaccionBDAsync<Respuesta<IPrestamosUsuariosDTO>, PrestamosUsuariosBL>(
			System.Transactions.IsolationLevel.ReadUncommitted,
			async () =>
			{
				 respuesta= await this.prestamosUsuariosRepositorioAccion.Value.ConsultarPrestamosUsuariosLlaveAsync(prestamosUsuarios);
				 respuesta.Resultado = true;
				 respuesta.TipoNotificacion = TipoNotificacion.Exitoso;
				 return respuesta;

			});
		}

		/// <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.EjecutarTransaccionBDAsync<Respuesta<IPrestamosUsuariosDTO>, PrestamosUsuariosBL>(
			System.Transactions.IsolationLevel.ReadUncommitted,
			async () =>
			{
				 respuesta= await this.prestamosUsuariosRepositorioAccion.Value.EditarPrestamosUsuariosAsync(prestamosUsuarios);
				 respuesta.Resultado = true;
				 respuesta.TipoNotificacion = TipoNotificacion.Exitoso;
				 respuesta.Mensajes.Add(rcsMensajesComunes.MensajeCreacionEdicionExitosa);
				 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.EjecutarTransaccionBDAsync<Respuesta<IPrestamosUsuariosDTO>, PrestamosUsuariosBL>(
			System.Transactions.IsolationLevel.ReadUncommitted,
			async () =>
			{
				 respuesta= await this.prestamosUsuariosRepositorioAccion.Value.EliminarPrestamosUsuariosAsync(prestamosUsuarios);
				 respuesta.Resultado = true;
				 respuesta.TipoNotificacion = TipoNotificacion.Exitoso;
				 respuesta.Mensajes.Add(rcsMensajesComunes.MensajeEntidadEliminadaConExito);
				 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.EjecutarTransaccionBDAsync<Respuesta<IPrestamosUsuariosDTO>, PrestamosUsuariosBL>(
			System.Transactions.IsolationLevel.ReadUncommitted,
			async () =>
			{
				 respuesta= await this.prestamosUsuariosRepositorioAccion.Value.GuardarPrestamosUsuariosAsync(prestamosUsuarios);
				 respuesta.Resultado = true;
				 respuesta.TipoNotificacion = TipoNotificacion.Exitoso;
				 respuesta.Mensajes.Add(rcsMensajesComunes.MensajeCreacionEdicionExitosa);
				 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.EjecutarTransaccionBDAsync<Respuesta<IPrestamosUsuariosDTO>, PrestamosUsuariosBL>(
			System.Transactions.IsolationLevel.ReadUncommitted,
			async () =>
			{
				 respuesta= await this.prestamosUsuariosRepositorioAccion.Value.GuardarListaPrestamosUsuariosAsync(listaPrestamosUsuarios);
				 respuesta.Resultado = true;
				 respuesta.TipoNotificacion = TipoNotificacion.Exitoso;
				 respuesta.Mensajes.Add(rcsMensajesComunes.MensajeCreacionEdicionExitosa);
				 return respuesta;

			});
		}
		#endregion METODOS PUBLICOS
		#region METODOS PRIVADOS
		#endregion METODOS PRIVADOS
	}
}

