// ------------------------------------------------------------------------------------
// <copyright file="IsbnDAL.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 Isbn
	/// </summary>
	public class IsbnDAL : AccesoComunDAL<ContextoBiblioteca>, IIsbnRepositorioAccion
	{
		/// <summary>
		/// Objeto para entidad respuesta
		/// </summary>
		Respuesta<IIsbnDTO> respuesta;

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

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

		/// <summary>
		/// Metodo editar isbn
		/// </summary>
		/// <param name="isbn">Entidad a editar</param>
		/// <returns>Respuesta tipo Isbn </returns>
		public async Task<Respuesta<IIsbnDTO>> EditarIsbnAsync(IIsbnDTO isbn)
		{
			return await this.EjecutarTransaccionAsync<Respuesta<IIsbnDTO>, IsbnDAL>(async () =>
			{
				Isbn IsbnEntidad = repositorio.BuscarPor(entidad => entidad
					.IdIsbn == isbn.IdIsbn).FirstOrDefault();
				Mapeador.MapearObjetosPorPropiedad(isbn, IsbnEntidad);
				repositorio.Editar(IsbnEntidad);
				repositorio.Guardar();
				return respuesta;
			});
		}

		/// <summary>
		/// Metodo editar  isbn por filtro 
		/// </summary>
		/// <param name="isbn">Entidad con los datos a editar</param>
		/// <param name="propiedades">Propiedades a modificar</param>
		/// <returns>Respuesta tipo Isbn </returns>
		public async Task<Respuesta<IIsbnDTO>> EditarIsbnPorFiltroAsync(IIsbnDTO isbn, params string[] propiedades)
        {
            return await this.EjecutarTransaccionAsync<Respuesta<IIsbnDTO>, IsbnDAL>(async () =>
            {
                Isbn isbnEntidad = repositorio.BuscarPor(entidad => entidad
                .IdIsbn == isbn.IdIsbn).FirstOrDefault();
                Mapeador.MapearObjetosPorPropiedadPorFiltro(isbn, isbnEntidad, propiedades);
                repositorio.Editar(isbnEntidad);
                      repositorio.Guardar();
                return respuesta;
            });
        }


		/// <summary>
		/// Metodo editar isbn 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 Isbn </returns>
		public async Task<Respuesta<IIsbnDTO>> EditarPorQueryIsbnAsync(Expression<Func<IIsbnDTO, bool>> filtro, IIsbnDTO valor, List<string> propiedades)
        {
            return await this.EjecutarTransaccionAsync<Respuesta<IIsbnDTO>, IsbnDAL>(async () =>
            {
          Isbn IsbnEntidad = Mapeador.MapearEntidadDTO(valor, new Isbn());
                Expression<Func<Isbn, bool>> filtros = Mapeador.MapearExpresion<IIsbnDTO, Isbn>(filtro);
                await repositorio.EditarPorQueryAsync(filtros, IsbnEntidad, propiedades);
                await repositorio.GuardarAsync();
                return respuesta;
            });
        }


		/// <summary>
		/// Metodo editar isbn lista 
		/// </summary>
		/// <param name="lista"> Lista con entidades a modificar</param>
		/// <returns>Respuesta tipo Isbn </returns>
		public async Task<Respuesta<IIsbnDTO>> EditarListaIsbnAsync(List<IIsbnDTO> lista)
        {
            return await this.EjecutarTransaccionAsync<Respuesta<IIsbnDTO>, IsbnDAL>(async () =>
            {
                List<Isbn> listaIsbn = new List<Isbn>();
                listaIsbn = Mapeador.MapearALista<IIsbnDTO, Isbn>(lista);
               await repositorio.EditarListaAsync(listaIsbn);
               await repositorio.GuardarAsync();
                return respuesta;
            });
        }

		/// <summary>
		/// Metodo eliminar isbn
		/// </summary>
		/// <param name="isbn">Entidad a eliminar</param>
		/// <returns>Respuesta tipo Isbn </returns>
        public async Task<Respuesta<IIsbnDTO>> EliminarIsbnAsync(IIsbnDTO isbn)
        {
            return await this.EjecutarTransaccionAsync<Respuesta<IIsbnDTO>, IsbnDAL>(async () =>
            {
				Isbn IsbnEntidad = repositorio.BuscarPor(entidad => entidad
					.IdIsbn == isbn.IdIsbn).FirstOrDefault();
				Mapeador.MapearObjetosPorPropiedad(isbn, IsbnEntidad);
				repositorio.Eliminar(IsbnEntidad);
                repositorio.Guardar();
                return respuesta;
            });
        }


		/// <summary>
		/// Metodo eliminar lista isbn 
		/// </summary>
		/// <param name="lista">Lista de entidad a eliminar</param>
		/// <returns>Respuesta tipo Isbn </returns>
        public async Task<Respuesta<IIsbnDTO>> EliminarListaIsbnAsync(List<IIsbnDTO> lista)
        {
            return await this.EjecutarTransaccionAsync<Respuesta<IIsbnDTO>, IsbnDAL>(async () =>
            {
                List<Isbn> listaIsbn = new List<Isbn>();
                listaIsbn = Mapeador.MapearALista<IIsbnDTO, Isbn>(lista);
               await repositorio.EliminarListaAsync(listaIsbn);
               await repositorio.GuardarAsync();
                return respuesta;
            });
        }

		/// <summary>
		/// Metodo guardar isbn
		/// </summary>
		/// <param name="isbn">Entidad a guardar</param>
		/// <returns>Respuesta tipo Isbn </returns>
        public async Task<Respuesta<IIsbnDTO>> GuardarIsbnAsync(IIsbnDTO isbn)
        {
            return await this.EjecutarTransaccionAsync<Respuesta<IIsbnDTO>, IsbnDAL>(async () =>
            {
                Isbn IsbnEntidad = Mapeador.MapearEntidadDTO(isbn, new Isbn());
               await repositorio.AgregarAsync(IsbnEntidad);
               await repositorio.GuardarAsync();
                respuesta.Entidades.Add(IsbnEntidad);
                return respuesta;

            });
        }

		/// <summary>
		/// Metodo Guardar lista isbn
		/// </summary>
		/// <param name="listaIsbn">Lista de entidades a guardar</param>
		/// <returns>Respuesta tipo Isbn </returns>
        public async Task<Respuesta<IIsbnDTO>> GuardarListaIsbnAsync(List<IIsbnDTO> listaIsbn)
        {
            return await this.EjecutarTransaccionAsync<Respuesta<IIsbnDTO>, IsbnDAL>(async () =>
            {
                List<Isbn> listaIsbnEntidad = Mapeador.MapearALista<IIsbnDTO, Isbn>(listaIsbn);
               await repositorio.AgregarListaAsync(listaIsbnEntidad);
                respuesta.Entidades.AddRange(listaIsbnEntidad);
                return respuesta;
            });
        }

		/// <summary>
		/// Metodo consultar lista isbn
		/// </summary>
		/// <returns>Respuesta tipo Isbn </returns>
        public async Task<Respuesta<IIsbnDTO>> ConsultarListaIsbnAsync()
        {
            return await this.EjecutarTransaccionAsync<Respuesta<IIsbnDTO>, IsbnDAL>(async () =>
            {
                respuesta.Entidades = repositorio.BuscarTodos().ToList<IIsbnDTO>();
                return respuesta;

            });
        }

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

            });
        }

		/// <summary>
		/// Metodo consultar por llave isbn
		/// </summary>
		/// <param name="isbn">Entidad a consultar</param>
		/// <returns>Respuesta tipo Isbn </returns>
        public async Task<Respuesta<IIsbnDTO>> ConsultarIsbnLlaveAsync(IIsbnDTO isbn)
        {
            return await this.EjecutarTransaccionAsync<Respuesta<IIsbnDTO>, IsbnDAL>(async () =>
            {
                respuesta.Entidades = (from entidad in ContextoBD.Isbn
                                       where entidad.IdIsbn == isbn.IdIsbn
                                       select entidad).ToList<IIsbnDTO>();

                return respuesta;

            });
        }
    }
}

