// ------------------------------------------------------------------------------------
// <copyright file="EditorialesDAL.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 Editoriales
	/// </summary>
	public class EditorialesDAL : AccesoComunDAL<ContextoBiblioteca>, IEditorialesRepositorioAccion
	{
		/// <summary>
		/// Objeto para entidad respuesta
		/// </summary>
		Respuesta<IEditorialesDTO> respuesta;

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

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

		/// <summary>
		/// Metodo editar editoriales
		/// </summary>
		/// <param name="editoriales">Entidad a editar</param>
		/// <returns>Respuesta tipo Editoriales </returns>
		public async Task<Respuesta<IEditorialesDTO>> EditarEditorialesAsync(IEditorialesDTO editoriales)
		{
			return await this.EjecutarTransaccionAsync<Respuesta<IEditorialesDTO>, EditorialesDAL>(async () =>
			{
				Editoriales EditorialesEntidad = repositorio.BuscarPor(entidad => entidad
					.IdEditorial == editoriales.IdEditorial).FirstOrDefault();
				Mapeador.MapearObjetosPorPropiedad(editoriales, EditorialesEntidad);
				repositorio.Editar(EditorialesEntidad);
				repositorio.Guardar();
				return respuesta;
			});
		}

		/// <summary>
		/// Metodo editar  editoriales por filtro 
		/// </summary>
		/// <param name="editoriales">Entidad con los datos a editar</param>
		/// <param name="propiedades">Propiedades a modificar</param>
		/// <returns>Respuesta tipo Editoriales </returns>
		public async Task<Respuesta<IEditorialesDTO>> EditarEditorialesPorFiltroAsync(IEditorialesDTO editoriales, params string[] propiedades)
        {
            return await this.EjecutarTransaccionAsync<Respuesta<IEditorialesDTO>, EditorialesDAL>(async () =>
            {
                Editoriales editorialesEntidad = repositorio.BuscarPor(entidad => entidad
                .IdEditorial == editoriales.IdEditorial).FirstOrDefault();
                Mapeador.MapearObjetosPorPropiedadPorFiltro(editoriales, editorialesEntidad, propiedades);
                repositorio.Editar(editorialesEntidad);
                      repositorio.Guardar();
                return respuesta;
            });
        }


		/// <summary>
		/// Metodo editar editoriales 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 Editoriales </returns>
		public async Task<Respuesta<IEditorialesDTO>> EditarPorQueryEditorialesAsync(Expression<Func<IEditorialesDTO, bool>> filtro, IEditorialesDTO valor, List<string> propiedades)
        {
            return await this.EjecutarTransaccionAsync<Respuesta<IEditorialesDTO>, EditorialesDAL>(async () =>
            {
          Editoriales EditorialesEntidad = Mapeador.MapearEntidadDTO(valor, new Editoriales());
                Expression<Func<Editoriales, bool>> filtros = Mapeador.MapearExpresion<IEditorialesDTO, Editoriales>(filtro);
                await repositorio.EditarPorQueryAsync(filtros, EditorialesEntidad, propiedades);
                await repositorio.GuardarAsync();
                return respuesta;
            });
        }


		/// <summary>
		/// Metodo editar editoriales lista 
		/// </summary>
		/// <param name="lista"> Lista con entidades a modificar</param>
		/// <returns>Respuesta tipo Editoriales </returns>
		public async Task<Respuesta<IEditorialesDTO>> EditarListaEditorialesAsync(List<IEditorialesDTO> lista)
        {
            return await this.EjecutarTransaccionAsync<Respuesta<IEditorialesDTO>, EditorialesDAL>(async () =>
            {
                List<Editoriales> listaEditoriales = new List<Editoriales>();
                listaEditoriales = Mapeador.MapearALista<IEditorialesDTO, Editoriales>(lista);
               await repositorio.EditarListaAsync(listaEditoriales);
               await repositorio.GuardarAsync();
                return respuesta;
            });
        }

		/// <summary>
		/// Metodo eliminar editoriales
		/// </summary>
		/// <param name="editoriales">Entidad a eliminar</param>
		/// <returns>Respuesta tipo Editoriales </returns>
        public async Task<Respuesta<IEditorialesDTO>> EliminarEditorialesAsync(IEditorialesDTO editoriales)
        {
            return await this.EjecutarTransaccionAsync<Respuesta<IEditorialesDTO>, EditorialesDAL>(async () =>
            {
				Editoriales EditorialesEntidad = repositorio.BuscarPor(entidad => entidad
					.IdEditorial == editoriales.IdEditorial).FirstOrDefault();
				Mapeador.MapearObjetosPorPropiedad(editoriales, EditorialesEntidad);
				repositorio.Eliminar(EditorialesEntidad);
                repositorio.Guardar();
                return respuesta;
            });
        }


		/// <summary>
		/// Metodo eliminar lista editoriales 
		/// </summary>
		/// <param name="lista">Lista de entidad a eliminar</param>
		/// <returns>Respuesta tipo Editoriales </returns>
        public async Task<Respuesta<IEditorialesDTO>> EliminarListaEditorialesAsync(List<IEditorialesDTO> lista)
        {
            return await this.EjecutarTransaccionAsync<Respuesta<IEditorialesDTO>, EditorialesDAL>(async () =>
            {
                List<Editoriales> listaEditoriales = new List<Editoriales>();
                listaEditoriales = Mapeador.MapearALista<IEditorialesDTO, Editoriales>(lista);
               await repositorio.EliminarListaAsync(listaEditoriales);
               await repositorio.GuardarAsync();
                return respuesta;
            });
        }

		/// <summary>
		/// Metodo guardar editoriales
		/// </summary>
		/// <param name="editoriales">Entidad a guardar</param>
		/// <returns>Respuesta tipo Editoriales </returns>
        public async Task<Respuesta<IEditorialesDTO>> GuardarEditorialesAsync(IEditorialesDTO editoriales)
        {
            return await this.EjecutarTransaccionAsync<Respuesta<IEditorialesDTO>, EditorialesDAL>(async () =>
            {
                Editoriales EditorialesEntidad = Mapeador.MapearEntidadDTO(editoriales, new Editoriales());
               await repositorio.AgregarAsync(EditorialesEntidad);
               await repositorio.GuardarAsync();
                respuesta.Entidades.Add(EditorialesEntidad);
                return respuesta;

            });
        }

		/// <summary>
		/// Metodo Guardar lista editoriales
		/// </summary>
		/// <param name="listaEditoriales">Lista de entidades a guardar</param>
		/// <returns>Respuesta tipo Editoriales </returns>
        public async Task<Respuesta<IEditorialesDTO>> GuardarListaEditorialesAsync(List<IEditorialesDTO> listaEditoriales)
        {
            return await this.EjecutarTransaccionAsync<Respuesta<IEditorialesDTO>, EditorialesDAL>(async () =>
            {
                List<Editoriales> listaEditorialesEntidad = Mapeador.MapearALista<IEditorialesDTO, Editoriales>(listaEditoriales);
               await repositorio.AgregarListaAsync(listaEditorialesEntidad);
                respuesta.Entidades.AddRange(listaEditorialesEntidad);
                return respuesta;
            });
        }

		/// <summary>
		/// Metodo consultar lista editoriales
		/// </summary>
		/// <returns>Respuesta tipo Editoriales </returns>
        public async Task<Respuesta<IEditorialesDTO>> ConsultarListaEditorialesAsync()
        {
            return await this.EjecutarTransaccionAsync<Respuesta<IEditorialesDTO>, EditorialesDAL>(async () =>
            {
                respuesta.Entidades = repositorio.BuscarTodos().ToList<IEditorialesDTO>();
                return respuesta;

            });
        }

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

            });
        }

		/// <summary>
		/// Metodo consultar por llave editoriales
		/// </summary>
		/// <param name="editoriales">Entidad a consultar</param>
		/// <returns>Respuesta tipo Editoriales </returns>
        public async Task<Respuesta<IEditorialesDTO>> ConsultarEditorialesLlaveAsync(IEditorialesDTO editoriales)
        {
            return await this.EjecutarTransaccionAsync<Respuesta<IEditorialesDTO>, EditorialesDAL>(async () =>
            {
                respuesta.Entidades = (from entidad in ContextoBD.Editoriales
                                       where entidad.IdEditorial == editoriales.IdEditorial
                                       select entidad).ToList<IEditorialesDTO>();

                return respuesta;

            });
        }
    }
}

