namespace Generator_Class_BD.Clases.NetCore._4.Interfaces_Comunes.Accion
{
    using Generator_Class_BD.Clases.Transversales;
    using Generator_Class_BD.Clases.Utilitarios;
    using System.Globalization;
    using System.Text;
    using System.Threading;

    public class ClaseAccion
    {
        public static void GenerarAcciones(string vNombreClase, string txtRuta, string TxtSolucion, string autor, string company)
        {
            string vNombreEntidad = "";
            string path = "";
            path = txtRuta + "\\4. Interfaces Comunes\\" + TxtSolucion + ".IC\\Acciones\\" + vNombreClase;

            CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;
            TextInfo textInfo = cultureInfo.TextInfo;
            vNombreEntidad = vNombreClase;
            vNombreClase = "I" + vNombreClase + "Accion";

            StringBuilder cuerpo = new StringBuilder();
            UtilitariosTransversales.EncabezadoDerechosAutor(vNombreClase, cuerpo, autor, company);
            cuerpo.Append("namespace " + TxtSolucion + ".IC.Acciones.Repositorio\n");
            cuerpo.Append("{\n");
            cuerpo.Append("\t" + ConstantesComunes.LibreriaSystem + "\n");
            cuerpo.Append("\t" + ConstantesComunes.LibreriaSystemCollectionsGeneric + "\n");
            cuerpo.Append("\t" + ConstantesComunes.LibreriaSystemLinqExpressions + "\n");
            cuerpo.Append("\t" + ConstantesComunes.LibreriaSystemThreadingTask + "\n");
            cuerpo.Append("\t" + ConstantesComunes.LibreriaUtilitariosNetClasesComunesEntidades + "\n");
            cuerpo.Append("\t" + string.Format(ConstantesComunes.LibreriaDTORepositorioIC, TxtSolucion) + "\n");
            cuerpo.Append("\n");
            cuerpo.Append("\t/// <summary>\n");
            cuerpo.Append("\t/// Interface que define las acciones que se implmentara en todas las capas de " + vNombreClase + "\n");
            cuerpo.Append("\t/// </summary>\n");
            cuerpo.Append("\tpublic interface " + vNombreClase + "\n");
            cuerpo.Append("\t{\n");

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

            UtilitariosTransversales.EncabezadoMetodoGuardar(vNombreEntidad, cuerpo, vNombreEntidadL);
            cuerpo.AppendFormat("\t\tTask<Respuesta<I{0}DTO>> Guardar{0}Async(I{0}DTO {1});\n", vNombreEntidad, vNombreEntidadL);

            UtilitariosTransversales.EncabezadoMetodoGuardarLista(vNombreEntidad, cuerpo, vNombreEntidadL);
            cuerpo.AppendFormat("\t\tTask<Respuesta<I{0}DTO>> GuardarLista{0}Async(List<I{0}DTO> lista{0});\n", vNombreEntidad);

            UtilitariosTransversales.EncabezadoMetodoEditar(vNombreEntidad, cuerpo, vNombreEntidadL);
            cuerpo.AppendFormat("\t\tTask<Respuesta<I{0}DTO>> Editar{0}Async(I{0}DTO {1});\n", vNombreEntidad, vNombreEntidadL);

            UtilitariosTransversales.EncabezadoMetodoConsultarLista(vNombreEntidad, cuerpo, vNombreEntidadL);
            cuerpo.AppendFormat("\t\tTask<Respuesta<I{0}DTO>> ConsultarLista{0}Async();\n", vNombreEntidad);

            UtilitariosTransversales.EncabezadoMetodoConsultarLlave(vNombreEntidad, cuerpo, vNombreEntidadL);
            cuerpo.AppendFormat("\t\tTask<Respuesta<I{0}DTO>> Consultar{0}LlaveAsync(I{0}DTO {1});\n", vNombreEntidad, vNombreEntidadL);
            UtilitariosTransversales.EncabezadoMetodoEliminar(vNombreEntidad, cuerpo, vNombreEntidadL);
            cuerpo.AppendFormat("\t\tTask<Respuesta<I{0}DTO>> Eliminar{0}Async(I{0}DTO {1});\n", vNombreEntidad, vNombreEntidadL);

            cuerpo.Append("\t}\n");
            cuerpo.Append("\n");

            cuerpo.Append("\n");
            cuerpo.Append("\t/// <summary>\n");
            cuerpo.Append("\t/// Interface que define las acciones de la capa de repositorio" + vNombreClase + "\n");
            cuerpo.Append("\t/// </summary>\n");

            cuerpo.Append("\tpublic interface I" + vNombreEntidad + "RepositorioAccion:" + vNombreClase + "\n");
            cuerpo.Append("\t{\n");

            UtilitariosTransversales.EncabezadoMetodoEditarPorQueryAsyncDal(vNombreEntidad, cuerpo, vNombreEntidadL);
            cuerpo.AppendFormat("\t\tTask<Respuesta<I{0}DTO>> EditarPorQuery{0}Async(Expression<Func<I{0}DTO, bool>> filtro, I{0}DTO valor, List<string> propiedades);\n", vNombreEntidad);

            UtilitariosTransversales.EncabezadoMetodoConsultarListaPorFiltroAsyncDal(vNombreEntidad, cuerpo, vNombreEntidadL);
            cuerpo.AppendFormat("\t\tTask<Respuesta<I{0}DTO>> ConsultarLista{0}PorFiltroAsync(Expression<Func<I{0}DTO, bool>> filtro);\n", vNombreEntidad, vNombreEntidadL);

            UtilitariosTransversales.EncabezadoMetodoEditarPorFiltroDal(vNombreEntidad, cuerpo, vNombreEntidadL);
            cuerpo.AppendFormat("\t\tTask<Respuesta<I{0}DTO>> Editar{0}PorFiltroAsync(I{0}DTO {1}, params string[] propiedades);\n", vNombreEntidad, vNombreEntidadL);

            UtilitariosTransversales.EncabezadoMetodoEliminarListaAsyncDal(vNombreEntidad, cuerpo, vNombreEntidadL);
            cuerpo.AppendFormat("\t\tTask<Respuesta<I{0}DTO>> EliminarLista{0}Async(List<I{0}DTO> lista);\n", vNombreEntidad, vNombreEntidadL);

            UtilitariosTransversales.EncabezadoMetodoEditarListaAsyncDal(vNombreEntidad, cuerpo, vNombreEntidadL);
            cuerpo.AppendFormat("\t\tTask<Respuesta<I{0}DTO>> EditarLista{0}Async(List<I{0}DTO> lista);\n", vNombreEntidad, vNombreEntidadL);

            cuerpo.Append("\t}\n");
            cuerpo.Append("\n");

            cuerpo.Append("\n");
            cuerpo.Append("\t/// <summary>\n");
            cuerpo.Append("\t/// Interface que define las acciones de la capa de negocio" + vNombreClase + "\n");
            cuerpo.Append("\t/// </summary>\n");
            cuerpo.Append("\tpublic interface I" + vNombreEntidad + "NegocioAccion:" + vNombreClase + "\n");
            cuerpo.Append("\t{\n");

            cuerpo.Append("\t}\n");
            cuerpo.Append("}");

            Util.CrearArchivo(path + "\\" + vNombreClase + ".cs", path, cuerpo);
        }

        public static void GenerarAccionesConsultas(string vNombreClase, string txtRuta, string TxtSolucion, string autor, string company)
        {
            string vNombreEntidad = "";
            string path = "";
            path = txtRuta + "\\6. Interfaces Comunes\\" + TxtSolucion + ".IC\\Acciones";

            CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;
            TextInfo textInfo = cultureInfo.TextInfo;
            vNombreEntidad = vNombreClase;
            vNombreClase = "I" + vNombreClase + "Accion";

            StringBuilder cuerpo = new StringBuilder();
            UtilitariosTransversales.EncabezadoDerechosAutor(vNombreClase, cuerpo, autor, company);
            cuerpo.Append("namespace " + TxtSolucion + ".IC.Acciones.Consultas\n");
            cuerpo.Append("{\n");
            cuerpo.Append("\t" + ConstantesComunes.LibreriaSystem + "\n");
            cuerpo.Append("\t" + ConstantesComunes.LibreriaSystemCollectionsGeneric + "\n");
            cuerpo.Append("\t" + ConstantesComunes.LibreriaSystemLinqExpressions + "\n");
            cuerpo.Append("\t" + ConstantesComunes.LibreriaSystemThreadingTask + "\n");
            cuerpo.Append("\t" + ConstantesComunes.LibreriaUtilitariosNetClasesComunesEntidades + "\n");
            cuerpo.Append("\t" + string.Format(ConstantesComunes.LibreriaDTORepositorioIC, TxtSolucion) + "\n");
            cuerpo.Append("\n");
            cuerpo.Append("\t/// <summary>\n");
            cuerpo.Append("\t/// Interface que define las acciones o metodos de " + Util.SeparadorPorMayusculas(vNombreClase) + "\n");
            cuerpo.Append("\t/// </summary>\n");
            cuerpo.Append("\tpublic interface " + vNombreClase + "\n");
            cuerpo.Append("\t{\n");

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

            cuerpo.AppendFormat("\t\tTask<Respuesta<I{0}DTO>> ConsultarLista{0}Async();\n", vNombreEntidad);
            cuerpo.Append("\t}\n");
            cuerpo.Append("\n");
            cuerpo.Append("\tpublic interface I" + vNombreEntidad + "RepositorioAccion\n");
            cuerpo.Append("\t{\n");
            cuerpo.AppendFormat("\t\tTask<Respuesta<I{0}DTO>> ConsultarLista{0}PorFiltroAsync(I{0}DTO {1}, Expression<Func<I{0}DTO, bool>> filtro);\n", vNombreEntidad, vNombreEntidadL);
            cuerpo.Append("\t}\n");
            cuerpo.Append("\n");
            cuerpo.Append("\tpublic interface I" + vNombreEntidad + "NegocioAccion\n");
            cuerpo.Append("\t{\n");
            cuerpo.AppendFormat("\t\tTask<Respuesta<I{0}DTO>> ConsultarLista{0}PorFiltroAsync(I{0}DTO {1});\n", vNombreEntidad, vNombreEntidadL);
            cuerpo.Append("\t}\n");
            cuerpo.Append("}");

            Util.CrearArchivo(path + "\\" + vNombreClase + ".cs", path, cuerpo);
        }
    }
}