namespace Generator_Class_BD.Clases.NetCore._3.Datos.DAL
{
    using Generator_Class_BD.Clases.Consultas;
    using Generator_Class_BD.Clases.Transversales;
    using Generator_Class_BD.Clases.Utilitarios;
    using System.Data;
    using System.Globalization;
    using System.Text;
    using System.Threading;

    public class ClaseDAL
    {
        internal static void GenerarDAL(string vNombreClase, string txtRuta, DataSet dsCol, string TxtSolucion, string autor, string company)
        {
            string path = txtRuta + "\\3. Datos\\" + TxtSolucion + ".Datos\\Clases\\DAL\\" + vNombreClase;

            CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;
            TextInfo textInfo = cultureInfo.TextInfo;
            string vNombreEntidad = vNombreClase;

            string vNombreEntidadL = vNombreEntidad.Substring(0, 1).ToLower() + vNombreEntidad.ToString().Substring(1);

            StringBuilder cuerpo = new StringBuilder();
            UtilitariosTransversales.EncabezadoDerechosAutor(vNombreClase + "DAL", cuerpo, autor, company);

            cuerpo.Append("namespace " + TxtSolucion + ".Datos.Clases.DAL.Repositorio\n");
            cuerpo.Append("{\n");
            cuerpo.Append("\t" + ConstantesComunes.LibreriaSystem + "\n");
            cuerpo.Append("\t" + ConstantesComunes.LibreriaSystemCollectionsGeneric + "\n");
            cuerpo.Append("\t" + ConstantesComunes.LibreriaSystemLinq + "\n");
            cuerpo.Append("\t" + ConstantesComunes.LibreriaSystemLinqExpressions + "\n");
            cuerpo.Append("\t" + ConstantesComunes.LibreriaSystemThreadingTask + "\n");
            cuerpo.Append("\t" + string.Format(ConstantesComunes.LibreriaRepositorioContexto, TxtSolucion) + "\n");
            cuerpo.Append("\t" + string.Format(ConstantesComunes.LibreriaRepositorioDatos, TxtSolucion) + "\n");
            cuerpo.Append("\t" + string.Format(ConstantesComunes.LibreriaAccionRepositorioIC, TxtSolucion) + "\n");
            cuerpo.Append("\t" + string.Format(ConstantesComunes.LibreriaDTORepositorioIC, TxtSolucion) + "\n");
            cuerpo.Append("\t" + ConstantesComunes.LibreriaUtilitariosNetTransaccional + "\n");
            cuerpo.Append("\t" + ConstantesComunes.LibreriaUtilitariosNetClasesComunesEntidades + "\n");
            cuerpo.Append("\t" + ConstantesComunes.LibreriaUtilitariosNetClasesMapeadorExtensiones + "\n");

            cuerpo.Append("\n");
            cuerpo.Append("\t/// <summary>\n");
            cuerpo.Append("\t/// Clase con las acciones de repositorio para la entidad " + vNombreEntidad + "\n");
            cuerpo.Append("\t/// </summary>\n");
            cuerpo.AppendFormat("\tpublic class {0}DAL : AccesoComunDAL<Contexto{1}>, I{0}RepositorioAccion\n", vNombreEntidad, TxtSolucion);
            cuerpo.Append("\t{\n");
            cuerpo.Append("\t\t/// <summary>\n");
            cuerpo.Append("\t\t/// Objeto para entidad respuesta\n");
            cuerpo.Append("\t\t/// </summary>\n");
            cuerpo.AppendFormat("\t\tRespuesta<I{0}DTO> respuesta;\n", vNombreEntidad);
            cuerpo.Append("\n");
            cuerpo.Append("\t\t/// <summary>\n");
            cuerpo.AppendFormat("\t\t/// Objeto para repositorio {0}\n", vNombreEntidad);
            cuerpo.Append("\t\t/// </summary>\n");
            cuerpo.AppendFormat("\t\tRepositorioGenerico<{0}> repositorio;\n", vNombreEntidad);
            cuerpo.Append("\n");

            cuerpo.Append("\t\t/// <summary>\n");
            cuerpo.AppendFormat("\t\t/// Inicializa una nueva instancia de la clase {0}DAL\n", vNombreEntidad);
            cuerpo.Append("\t\t/// </summary>\n");
            cuerpo.AppendFormat("\t\tpublic {0}DAL()\n", vNombreEntidad);
            cuerpo.Append("\t\t{\n");
            cuerpo.AppendFormat("\t\t\tthis.respuesta = new Respuesta<I{0}DTO>();\n", vNombreEntidad);
            cuerpo.AppendFormat("\t\t\tthis.repositorio = new RepositorioGenerico<{0}>(ContextoBD);\n", vNombreEntidad);
            cuerpo.Append("\t\t}\n");
            cuerpo.Append("\n");

            UtilitariosTransversales.EncabezadoMetodoEditar(vNombreEntidad, cuerpo, vNombreEntidadL);
            cuerpo.AppendFormat("\t\tpublic async Task<Respuesta<I{0}DTO>> Editar{0}Async(I{0}DTO {1})\n", vNombreEntidad, vNombreEntidadL);
            cuerpo.Append("\t\t{\n");
            cuerpo.AppendFormat("\t\t\treturn await this.EjecutarTransaccionAsync<Respuesta<I{0}DTO>, {0}DAL>(async () =>\n", vNombreEntidad);
            cuerpo.Append("\t\t\t{\n");
            cuerpo.AppendFormat("\t\t\t\t{0} {0}Entidad = repositorio.BuscarPor(entidad => entidad\n", vNombreEntidad, vNombreEntidadL);
            cuerpo.AppendFormat("\t\t\t\t\t." + dsCol.Tables[0].Rows[0]["column_name"].ToString() + " == {0}." + dsCol.Tables[0].Rows[0]["column_name"].ToString() + ").FirstOrDefault();\n", vNombreEntidadL);
            cuerpo.AppendFormat("\t\t\t\tMapeador.MapearObjetosPorPropiedad({1}, {0}Entidad);\n", vNombreEntidad, vNombreEntidadL);
            cuerpo.AppendFormat("\t\t\t\trepositorio.Editar({0}Entidad);\n", vNombreEntidad);
            cuerpo.Append("\t\t\t\trepositorio.Guardar();\n");
            cuerpo.Append("\t\t\t\treturn respuesta;\n");
            cuerpo.Append("\t\t\t});\n");
            cuerpo.Append("\t\t}\n");
            cuerpo.Append("\n");

            UtilitariosTransversales.EncabezadoMetodoEditarPorFiltroDal(vNombreEntidad, cuerpo, vNombreEntidadL);
            cuerpo.AppendFormat("\t\tpublic async Task<Respuesta<I{0}DTO>> Editar{0}PorFiltroAsync(I{0}DTO {1}, params string[] propiedades)\n", vNombreEntidad, vNombreEntidadL);
            cuerpo.Append("        {\n");
            cuerpo.AppendFormat("            return await this.EjecutarTransaccionAsync<Respuesta<I{0}DTO>, {0}DAL>(async () =>\n", vNombreEntidad);
            cuerpo.Append("            {\n");
            cuerpo.AppendFormat("                {0} {1}Entidad = repositorio.BuscarPor(entidad => entidad\n", vNombreEntidad, vNombreEntidadL);
            cuerpo.AppendFormat("                ." + dsCol.Tables[0].Rows[0]["column_name"].ToString() + " == {0}." + dsCol.Tables[0].Rows[0]["column_name"].ToString() + ").FirstOrDefault();\n", vNombreEntidadL);
            cuerpo.AppendFormat("                Mapeador.MapearObjetosPorPropiedadPorFiltro({1}, {1}Entidad, propiedades);\n", vNombreEntidad, vNombreEntidadL);
            cuerpo.AppendFormat("                repositorio.Editar({1}Entidad);\n", vNombreEntidad, vNombreEntidadL);
            cuerpo.Append("                      repositorio.Guardar();\n");
            cuerpo.Append("                return respuesta;\n");
            cuerpo.Append("            });\n");
            cuerpo.Append("        }\n");
            cuerpo.Append("\n");
            cuerpo.Append("\n");

            UtilitariosTransversales.EncabezadoMetodoEditarPorQueryAsyncDal(vNombreEntidad, cuerpo, vNombreEntidadL);
            cuerpo.AppendFormat("\t\tpublic async Task<Respuesta<I{0}DTO>> EditarPorQuery{0}Async(Expression<Func<I{0}DTO, bool>> filtro, I{0}DTO valor, List<string> propiedades)\n", vNombreEntidad);
            cuerpo.Append("        {\n");
            cuerpo.AppendFormat("            return await this.EjecutarTransaccionAsync<Respuesta<I{0}DTO>, {0}DAL>(async () =>\n", vNombreEntidad);
            cuerpo.Append("            {\n");
            cuerpo.AppendFormat("          {0} {0}Entidad = Mapeador.MapearEntidadDTO(valor, new {0}());\n", vNombreEntidad);
            cuerpo.Append("                Expression<Func<" + vNombreEntidad + ", bool>> filtros = Mapeador.MapearExpresion<I" + vNombreEntidad + "DTO, " + vNombreEntidad + ">(filtro);\n");
            cuerpo.AppendFormat("                await repositorio.EditarPorQueryAsync(filtros, {0}Entidad, propiedades);\n", vNombreEntidad);
            cuerpo.Append("                await repositorio.GuardarAsync();\n");
            cuerpo.Append("                return respuesta;\n");
            cuerpo.Append("            });\n");
            cuerpo.Append("        }\n");
            cuerpo.Append("\n");
            cuerpo.Append("\n");

            UtilitariosTransversales.EncabezadoMetodoEditarListaAsyncDal(vNombreEntidad, cuerpo, vNombreEntidadL);
            cuerpo.AppendFormat("\t\tpublic async Task<Respuesta<I{0}DTO>> EditarLista{0}Async(List<I{0}DTO> lista)\n", vNombreEntidad, vNombreEntidadL);
            cuerpo.Append("        {\n");
            cuerpo.AppendFormat("            return await this.EjecutarTransaccionAsync<Respuesta<I{0}DTO>, {0}DAL>(async () =>\n", vNombreEntidad);
            cuerpo.Append("            {\n");
            cuerpo.AppendFormat("                List<{0}> lista{0} = new List<{0}>();\n", vNombreEntidad);
            cuerpo.Append("                lista" + vNombreEntidad + " = Mapeador.MapearALista<I" + vNombreEntidad + "DTO, " + vNombreEntidad + ">(lista);\n");
            cuerpo.AppendFormat("               await repositorio.EditarListaAsync(lista{0});\n", vNombreEntidad, vNombreEntidadL);
            cuerpo.Append("               await repositorio.GuardarAsync();\n");
            cuerpo.Append("                return respuesta;\n");
            cuerpo.Append("            });\n");
            cuerpo.Append("        }\n");
            cuerpo.Append("\n");

            UtilitariosTransversales.EncabezadoMetodoEliminar(vNombreEntidad, cuerpo, vNombreEntidadL);
            cuerpo.AppendFormat("        public async Task<Respuesta<I{0}DTO>> Eliminar{0}Async(I{0}DTO {1})\n", vNombreEntidad, vNombreEntidadL);
            cuerpo.Append("        {\n");
            cuerpo.AppendFormat("            return await this.EjecutarTransaccionAsync<Respuesta<I{0}DTO>, {0}DAL>(async () =>\n", vNombreEntidad);
            cuerpo.Append("            {\n");
            cuerpo.AppendFormat("\t\t\t\t{0} {0}Entidad = repositorio.BuscarPor(entidad => entidad\n", vNombreEntidad, vNombreEntidadL);
            cuerpo.AppendFormat("\t\t\t\t\t." + dsCol.Tables[0].Rows[0]["column_name"].ToString() + " == {0}." + dsCol.Tables[0].Rows[0]["column_name"].ToString() + ").FirstOrDefault();\n", vNombreEntidadL);
            cuerpo.AppendFormat("\t\t\t\tMapeador.MapearObjetosPorPropiedad({1}, {0}Entidad);\n", vNombreEntidad, vNombreEntidadL);
            cuerpo.AppendFormat("\t\t\t\trepositorio.Eliminar({0}Entidad);\n", vNombreEntidad);
            cuerpo.Append("                repositorio.Guardar();\n");
            cuerpo.Append("                return respuesta;\n");
            cuerpo.Append("            });\n");
            cuerpo.Append("        }\n");
            cuerpo.Append("\n");
            cuerpo.Append("\n");

            UtilitariosTransversales.EncabezadoMetodoEliminarListaAsyncDal(vNombreEntidad, cuerpo, vNombreEntidadL);
            cuerpo.AppendFormat("        public async Task<Respuesta<I{0}DTO>> EliminarLista{0}Async(List<I{0}DTO> lista)\n", vNombreEntidad, vNombreEntidadL);
            cuerpo.Append("        {\n");
            cuerpo.AppendFormat("            return await this.EjecutarTransaccionAsync<Respuesta<I{0}DTO>, {0}DAL>(async () =>\n", vNombreEntidad);
            cuerpo.Append("            {\n");
            cuerpo.AppendFormat("                List<{0}> lista{0} = new List<{0}>();\n", vNombreEntidad);
            cuerpo.Append("                lista" + vNombreEntidad + " = Mapeador.MapearALista<I" + vNombreEntidad + "DTO, " + vNombreEntidad + ">(lista);\n");
            cuerpo.AppendFormat("               await repositorio.EliminarListaAsync(lista{0});\n", vNombreEntidad, vNombreEntidadL);
            cuerpo.Append("               await repositorio.GuardarAsync();\n");
            cuerpo.Append("                return respuesta;\n");
            cuerpo.Append("            });\n");
            cuerpo.Append("        }\n");
            cuerpo.Append("\n");

            UtilitariosTransversales.EncabezadoMetodoGuardar(vNombreEntidad, cuerpo, vNombreEntidadL);
            cuerpo.AppendFormat("        public async Task<Respuesta<I{0}DTO>> Guardar{0}Async(I{0}DTO {1})\n", vNombreEntidad, vNombreEntidadL);
            cuerpo.Append("        {\n");
            cuerpo.AppendFormat("            return await this.EjecutarTransaccionAsync<Respuesta<I{0}DTO>, {0}DAL>(async () =>\n", vNombreEntidad);
            cuerpo.Append("            {\n");
            cuerpo.AppendFormat("                {0} {0}Entidad = Mapeador.MapearEntidadDTO({1}, new {0}());\n", vNombreEntidad, vNombreEntidadL);
            cuerpo.AppendFormat("               await repositorio.AgregarAsync({0}Entidad);\n", vNombreEntidad);
            cuerpo.Append("               await repositorio.GuardarAsync();\n");
            cuerpo.AppendFormat("                respuesta.Entidades.Add({0}Entidad);\n", vNombreEntidad);
            cuerpo.Append("                return respuesta;\n");
            cuerpo.Append("\n");
            cuerpo.Append("            });\n");
            cuerpo.Append("        }\n");
            cuerpo.Append("\n");

            UtilitariosTransversales.EncabezadoMetodoGuardarLista(vNombreEntidad, cuerpo, vNombreEntidadL);
            cuerpo.AppendFormat("        public async Task<Respuesta<I{0}DTO>> GuardarLista{0}Async(List<I{0}DTO> lista{0})\n", vNombreEntidad);
            cuerpo.Append("        {\n");
            cuerpo.AppendFormat("            return await this.EjecutarTransaccionAsync<Respuesta<I{0}DTO>, {0}DAL>(async () =>\n", vNombreEntidad);
            cuerpo.Append("            {\n");
            cuerpo.AppendFormat("                List<{0}> lista{0}Entidad = Mapeador.MapearALista<I{0}DTO, {0}>(lista{0});\n", vNombreEntidad);
            cuerpo.AppendFormat("               await repositorio.AgregarListaAsync(lista{0}Entidad);\n", vNombreEntidad);
            cuerpo.AppendFormat("                respuesta.Entidades.AddRange(lista{0}Entidad);\n", vNombreEntidad);
            cuerpo.Append("                return respuesta;\n");
            cuerpo.Append("            });\n");
            cuerpo.Append("        }\n");
            cuerpo.Append("\n");

            UtilitariosTransversales.EncabezadoMetodoConsultarLista(vNombreEntidad, cuerpo, vNombreEntidadL);
            cuerpo.AppendFormat("        public async Task<Respuesta<I{0}DTO>> ConsultarLista{0}Async()\n", vNombreEntidad);
            cuerpo.Append("        {\n");
            cuerpo.AppendFormat("            return await this.EjecutarTransaccionAsync<Respuesta<I{0}DTO>, {0}DAL>(async () =>\n", vNombreEntidad);
            cuerpo.Append("            {\n");
            cuerpo.AppendFormat("                respuesta.Entidades = repositorio.BuscarTodos().ToList<I{0}DTO>();\n", vNombreEntidad);
            cuerpo.Append("                return respuesta;\n");
            cuerpo.Append("\n");
            cuerpo.Append("            });\n");
            cuerpo.Append("        }\n");
            cuerpo.Append("\n");

            UtilitariosTransversales.EncabezadoMetodoConsultarListaPorFiltroDal(vNombreEntidad, cuerpo, vNombreEntidadL);
            cuerpo.AppendFormat("        public async Task<Respuesta<I{0}DTO>> ConsultarLista{0}PorFiltroAsync(Expression<Func<I{0}DTO, bool>> filtro)\n", vNombreEntidad, vNombreEntidadL);
            cuerpo.Append("        {\n");
            cuerpo.AppendFormat("            return await this.EjecutarTransaccionAsync<Respuesta<I{0}DTO>, {0}DAL>(async () =>\n", vNombreEntidad);
            cuerpo.Append("            {\n");
            cuerpo.AppendFormat("                respuesta.Entidades = repositorio.BuscarPor(Mapeador.MapearExpresion<I{0}DTO, {0}>(filtro)).ToList<I{0}DTO>();\n", vNombreEntidad);
            cuerpo.Append("                return respuesta;\n");
            cuerpo.Append("\n");
            cuerpo.Append("            });\n");
            cuerpo.Append("        }\n");
            cuerpo.Append("\n");

            UtilitariosTransversales.EncabezadoMetodoConsultarLlave(vNombreEntidad, cuerpo, vNombreEntidadL);
            cuerpo.AppendFormat("        public async Task<Respuesta<I{0}DTO>> Consultar{0}LlaveAsync(I{0}DTO {1})\n", vNombreEntidad, vNombreEntidadL);
            cuerpo.Append("        {\n");
            cuerpo.AppendFormat("            return await this.EjecutarTransaccionAsync<Respuesta<I{0}DTO>, {0}DAL>(async () =>\n", vNombreEntidad);
            cuerpo.Append("            {\n");
            cuerpo.AppendFormat("                respuesta.Entidades = (from entidad in ContextoBD.{0}\n", vNombreEntidad);
            cuerpo.AppendFormat("                                       where entidad." + dsCol.Tables[0].Rows[0]["column_name"].ToString() + " == {0}." + dsCol.Tables[0].Rows[0]["column_name"].ToString() + "\n", vNombreEntidadL);
            cuerpo.AppendFormat("                                       select entidad).ToList<I{0}DTO>();\n", vNombreEntidad);
            cuerpo.Append("\n");
            cuerpo.Append("                return respuesta;\n");
            cuerpo.Append("\n");
            cuerpo.Append("            });\n");
            cuerpo.Append("        }\n");
            cuerpo.Append("    }\n");
            cuerpo.Append("}\n");

            Util.CrearArchivo(string.Format("{0}\\{1}{2}", path, vNombreClase, "DAL.cs"), path, cuerpo);
        }

        internal static void GenerarDALConsultas(Consulta consulta, string txtRuta, string TxtSolucion, string autor, string company)
        {
            string vNombreEntidad = "";
            string path = "";

            path = txtRuta + "\\5. Datos\\" + TxtSolucion + ".Datos\\Clases\\DAL";

            CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;
            TextInfo textInfo = cultureInfo.TextInfo;
            vNombreEntidad = consulta.NombreObjeto;

            string vNombreEntidadL = vNombreEntidad.Substring(0, 1).ToLower() + vNombreEntidad.ToString().Substring(1);

            StringBuilder cuerpo = new StringBuilder();
            UtilitariosTransversales.EncabezadoDerechosAutor(consulta.NombreObjeto + "DAL", cuerpo, autor, company);
            cuerpo.Append("namespace " + TxtSolucion + ".Datos.Clases.DAL.Repositorio\n");
            cuerpo.Append("{\n");
            cuerpo.Append("\t" + string.Format(ConstantesComunes.LibreriaRepositorioDatos, TxtSolucion) + "\n");
            cuerpo.Append("\t" + string.Format(ConstantesComunes.LibreriaAccionRepositorioIC, TxtSolucion) + "\n");
            cuerpo.Append("\t" + string.Format(ConstantesComunes.LibreriaDTORepositorioIC, TxtSolucion) + "\n");
            cuerpo.Append("\t" + ConstantesComunes.LibreriaUtilitariosTransaccional + "\n");
            cuerpo.Append("\t" + ConstantesComunes.LibreriaUtilitariosClasesComunesEntidades + "\n");
            cuerpo.Append("\t" + ConstantesComunes.LibreriaUtilitariosClasesMapeadorExtensiones + "\n");
            cuerpo.Append("\t" + ConstantesComunes.LibreriaSystem + "\n");
            cuerpo.Append("\t" + ConstantesComunes.LibreriaSystemCollectionsGeneric + "\n");
            cuerpo.Append("\t" + ConstantesComunes.LibreriaSystemLinq + "\n");
            cuerpo.Append("\t" + ConstantesComunes.LibreriaSystemLinqExpressions + "\n");
            cuerpo.Append("\n");
            cuerpo.AppendFormat("\tpublic class {0}DAL : AccesoComunDAL<Contexto{1}>, I{0}Accion, I{0}RepositorioAccion\n", vNombreEntidad, TxtSolucion);
            cuerpo.Append("\t{\n");
            cuerpo.AppendFormat("\t\tRespuesta<I{0}DTO> respuesta;\n", vNombreEntidad);
            cuerpo.AppendFormat("\t\tRepositorioGenerico<{0}> Repositorio;\n", vNombreEntidad);
            cuerpo.Append("\n");
            cuerpo.AppendFormat("\t\tpublic {0}DAL()\n", vNombreEntidad);
            cuerpo.Append("\t\t{\n");
            cuerpo.AppendFormat("\t\t\tthis.respuesta = new Respuesta<I{0}DTO>();\n", vNombreEntidad);
            cuerpo.AppendFormat("\t\t\tthis.Repositorio = new RepositorioGenerico<{0}>(ContextoBD);\n", vNombreEntidad);
            cuerpo.Append("\t\t}\n");
            cuerpo.Append("\n");
            cuerpo.AppendFormat("        public async Task<Respuesta<I{0}DTO>> ConsultarLista{0}Async()\n", vNombreEntidad);
            cuerpo.Append("        {\n");
            cuerpo.AppendFormat("            return await this.EjecutarTransaccionAsync<Respuesta<I{0}DTO>, {0}DAL>(async () =>\n", vNombreEntidad);
            cuerpo.Append("            {\n");
            cuerpo.Append("                respuesta.Entidades = (" + consulta.ScriptLINQ + ").ToList<I" + vNombreEntidad + "DTO>();");
            cuerpo.Append("                respuesta.Resultado = true;\n");
            cuerpo.Append("                respuesta.TipoNotificacion = TipoNotificacion.Exitoso;\n");
            cuerpo.Append("                return respuesta;\n");
            cuerpo.Append("\n");
            cuerpo.Append("            });\n");
            cuerpo.Append("        }\n");
            cuerpo.Append("\n");
            cuerpo.AppendFormat("        public Respuesta<I{0}DTO>> ConsultarLista{0}PorFiltroAsync(I{0}DTO {1}, Expression<Func<I{0}DTO, bool>> filtro)\n", vNombreEntidad, vNombreEntidadL);
            cuerpo.Append("        {\n");
            cuerpo.AppendFormat("            return await this.EjecutarTransaccionAsync<Respuesta<I{0}DTO>, {0}DAL>(async () =>\n", vNombreEntidad);
            cuerpo.Append("            {\n");
            cuerpo.AppendFormat("                respuesta.Entidades = Repositorio.BuscarPor(Mapeador.MapearExpresion<I{0}DTO, {0}>(filtro)).ToList<I{0}DTO>();\n", vNombreEntidad);
            cuerpo.Append("                return respuesta;\n");
            cuerpo.Append("\n");
            cuerpo.Append("            });\n");
            cuerpo.Append("        }\n");
            cuerpo.Append("\n");
            cuerpo.Append("    }\n");
            cuerpo.Append("}\n");

            Util.CrearArchivo(string.Format("{0}\\{1}{2}", path, consulta.NombreObjeto, "DAL.cs"), path, cuerpo);
        }
    }
}